3

のサブリストのいずれかにlist1繰り返し値があるかどうかを調べようとしているので、list1[0] の数値が list[1] の同じ数値であるかどうかを知る必要があります (20 が繰り返されます)。

数字は座標を表し、list1 の各項目の座標は重複できません。重複している場合は、座標がなくなるまで新しい list1 を作成するモジュールを再実行します。

助けてください

    list1 = [[7, 20], [20, 31, 32], [66, 67, 68],[7, 8, 9, 2],
             [83, 84, 20, 86, 87], [144, 145, 146, 147, 148, 149]]

    x=0
    while x != 169:
        if list1.count(x) > 0:
        print ("repeat found")
    else:
        print ("no repeat found")
    x+=1
4

4 に答える 4

2

更新された質問の解決策

def has_duplicates(iterable):
    """Searching for duplicates in sub iterables.

    This approach can be faster than whole-container solutions
    with flattening if duplicates in large iterables are found 
    early.
    """
    seen = set()
    for sub_list in iterable:
        for item in sub_list:
            if item in seen:
                return True
            seen.add(item)
    return False


>>> has_duplicates(list1)
True
>>> has_duplicates([[1, 2], [4, 5]])
False
>>> has_duplicates([[1, 2], [4, 5, 1]])
True

セット内のルックアップは高速です。seen高速にしたい場合は、リストを使用しないでください。

質問の元のバージョンの解決策

リストの長さがこのリストから作成されたセットの長さよりも大きい場合、セットは一意の要素しか持てないため、繰り返し項目が存在する必要があります。

>>> L = [[1, 1, 2], [1, 2, 3], [4, 4, 4]]
>>> [len(item) - len(set(item)) for item in L]
[1, 0, 2]

これがここの鍵です

>>> {1, 2, 3, 1, 2, 1}
set([1, 2, 3])

編集

各サブリストの繰り返し回数に関心がない場合。より大きい最初の数値の後に停止するため、これはより効率的です0

>>> any(len(item) - len(set(item)) for item in L)
True

これを指摘してくれた@mataに感謝します。

于 2013-06-08T22:29:56.037 に答える
0

Python 2.7+ の場合は、次のことを試してくださいCounter

import collections

list = [1, 2, 3, 2, 1]
count = collections.Counter(list)

次に、カウントは次のようになります。

Counter({1: 2, 2: 2, 3:1})

続きを読む

于 2013-06-08T22:31:17.290 に答える