0

ここでは、あるサブリストの一部を別のサブリスト内で検索しようとしている初心者です。

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 2, 5]]

for item in list_1:
    for otherItem in list_2:
        item[0:2] in otherItem[0:2]

これが戻ってくることを願っていた

True
False
True
False
True
False

しかし、代わりに、すべての反復で false になります。手短に:

list_1[0][0:2] == list_2[0][0:2] #this returns true
list_1[0][0:2] in list_2[0][0:2] #this returns false

仕組みを理解していないと思いますin。ここで私を教えてくれる人はいますか?

4

3 に答える 3

6

in1 つのサブリストが別のリストの要素(サブリストではない) であるかどうかを調べます。

[1,2] in [[1,2],[3,4]]

でしょうTrue

[1,2] in [1,2,3]

次のようになりますFalse

[1,2] in [1,2]

でも:

[1,2] == [1,2]

でしょうTrue。実際に何をしようとしているのかによっては、setオブジェクトが役立つ場合があります。

a = [1,2]
b = [1,2,3]
c = [3,2,1]
d = [1,1,1]
e = set(a)
len(e.intersection(b)) == len(a)  #True
len(e.intersection(c)) == len(a)  #True -- Order of elements does not matter
len(e.intersection(d)) == len(a)  #False
于 2013-02-28T19:29:29.517 に答える
2

リストの例を考えると:

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 2, 5]]

これは機能します:

print [this[0:2]==that[0:2] for this in list_1 for that in list_2]
[True, False, True, False, True, False]

または、セットを使用します。

print [this for this in list_1 for that in list_2 if set(this[0:2])<set(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]

セットには順序がないことに注意してください。

>>> set([1,2])==set([2,1])
True

の典型的な使用法はin文字列です:

>>> 'ab' in 'cbcbab'
True

またはシーケンス内の単一の要素:

>>> 100 in range(1000)
True

またはシーケンス内のアトミック要素:

>>> (3,3,3) in zip(*[range(10)]*3)
True

ただし、重なり合うリスト要素は機能しません。

>>> [1,2] in [0,1,2,3]
False

要素が同じ原子サイズでない限り:

>>> [1,2] in [0,[1,2],3]
True

ただし、次のように文字列を使用して、リスト a がリスト b の「内」にあることを比較できます。

>>> def stringy(li): return ''.join(map(str,li))
...
>>> stringy([1,2,9][0:2])
'12'
>>> stringy([1,2,9][0:2]) in stringy([1,2,5])
True

したがって、元の意図は、ループ内の「アイテム」の順序以外のitem[0:2]どこかに表示されることを確認することである場合があります。otherItem次のような文字列を使用できます。

>>> print [this for this in list_1 for that in list_2 if stringy(this[0:2]) in stringy(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]

これは、以降のセット バージョンとは異なり'12'!='21'ます'12' not in '21' 。したがって、list_2 の要素の順序を変更した場合:

list_1 = [[1, 2, 9], [4, 5, 8]]
list_2 = [[1, 2, 3], [4, 5, 6], [1, 5, 2]]

print [this for this in list_1 for that in list_2 if set(this[0:2])<set(that)]
[[1, 2, 9], [1, 2, 9], [4, 5, 8]]   # same answer since sets are unordered
print [this for this in list_1 for that in list_2 if stringy(this[0:2]) in stringy(that)]
[[1, 2, 9], [4, 5, 8]]              # different answer...
于 2013-02-28T19:35:21.457 に答える
1
print set([1,2]).intersection([1,2,3])==set([1,2])

だろうTrue

セット交差点を使用すると、必要なものを取得できると思います

セットは順序付けられていないコレクション固有の要素であることに注意することが重要です

したがってset([1,1,2]) == set([1,2]) 、これは必ずしもすべてのインスタンスで機能するとは限りません

于 2013-02-28T19:32:39.490 に答える