13

こんにちは、コーディングを始めて 2 か月経ち、基本は理解できましたが、解決策が見つからないセット メンバーシップの問題があります。

整数のペアのリストのリストがあり、「a」整数を含むリストを削除したいと考えています。セットを使用するのが最も簡単な方法だと思いました。以下はコードです:

## This is the item to test against. 
a = set([3]) 
## This is the list to test.      
groups = [[3, 2], [3, 4], [1, 2], [5, 4], [4, 3]]     

## This is a list that will contain the lists present
## in groups which do not contain "a"
groups_no_a = []        

for group in groups:
    group = set(group)
    if a in group:
        groups_no_a.append(group)
    ## I thought the problem had something to do with
    ## clearing the variable so I put this in,   
    ## but to no remedy. 
    group.clear()  


print groups_no_a 

のすべての要素がs.issubset(t)テストされていることに気付くまで、私も使用してみました。st

ありがとうございました!

4

4 に答える 4

8

交差点がないかどうかをテストしたい:

if not a & group:

また

if not a.intersection(group):

または、逆に、セットがばらばらであること:

if a.isdisjoint(group):

メソッドフォームはイテラブルを取りgroupそのためにセットにする必要さえありません。次のワンライナーも機能します。

groups_no_a = [group for group in groups if a.isdisjoint(group)]

デモ:

>>> a = set([3]) 
>>> groups = [[3, 2], [3, 4], [1, 2], [5, 4], [4, 3]]     
>>> [group for group in groups if a.isdisjoint(group)]
[[1, 2], [5, 4]]

テストしている要素が1 つだけの場合、セットを作成すると、メンバーシップのテストで得られるものよりもパフォーマンスが高くなる可能性があります。

3 not in group

group短いリストです。

timeitこのモジュールを使用してPython コードの断片を比較し、特定の一般的なリスト サイズに最適なものを確認できます。

于 2013-08-18T15:18:55.113 に答える
4

たぶん、リスト内包表記を使用できます:

a = 3
groups = [[3, 2], [3, 4], [1, 2], [5, 4], [4, 3]]
print [x for x in groups if a not in x]

コメントに基づいて編集します。

好奇心旺盛な方へ、私がやりたいことは次のとおりです。次のようなリストがあります。 ] ] で、エラーが最も少なく、group_item_1 または group_item_2 に「a」が含まれていないアイテムを取得したいと考えています。リストはすでにエラーでソートされています。私はちょっとそれを行く:D

これでうまくいくはずです:

from itertools import chain, iterfilter

def flatten(listOfLists):
    "Flatten one level of nesting"
    return chain.from_iterable(listOfLists)


errors_list =  [ ['error0', [ [30, 2], [3, 4], [1, 2], [5, 4], [4, 3] ] ], ['error1', [ [31, 2], [3, 4], [1, 2], [5, 4], [4, 3] ] ] ]

a = 30
result = next(ifilter(lambda err: a not in flatten(err[1]), reversed(errors_list)), None)

print result #finds error1 as it has no 30 on its list
于 2013-08-18T15:22:05.223 に答える
0

= set([3]) を作成するのではなく、次のようにしてみませんか?

a = 3
groups = [[3, 2], [3, 4], [1, 2], [5, 4], [4, 3]]
groups_no_a = [group for group in groups if a not in group]
于 2013-08-18T15:21:24.933 に答える
-1

ここでセットを使用する必要はありません。リスト内の要素のメンバーシップをテストできます。あなたも持っているようですがin、私はあなたが持っているべきだと思いますnot in

このコードはあなたのものに似ており、動作するはずです:

## This is the item to test against. 
a = 3
## This is the list to test.      
groups = [[3, 2], [3, 4], [1, 2], [5, 4], [4, 3]]     

## This is a list that will contain the lists present
## in groups which do not contain a
groups_no_a = []        

for group in groups:
    if a not in group:
        groups_no_a.append(group)

print groups_no_a

ただし、より短く、より Pythonic な方法では、リスト内包表記を使用します。

groups_no_a = [i for i in groups if a not in i]

アイテムがはるかに長いリストにあるかどうかをテストする場合は、パフォーマンスのために代わりにセットを使用する必要があります。

于 2013-08-18T15:21:23.073 に答える