1

既存のリストで番号を検索したいと思います。この数値の 1 つが繰り返される場合は、変数の値を true に設定し、ループを中断します。

list = [3, 5, 3] //numbers in list

したがって、関数が 2 つの同じ数値を取得した場合は、ブレークします。この場合、3 が繰り返されます。

どうやってするか?

4

5 に答える 5

4

まず、リストに名前を付けないでくださいlist。これはPythonに組み込まれているものであり、変数名として使用すると、望ましくない副作用が発生する可能性があります。L代わりにそれを呼びましょう。

リストをそれ自体の設定バージョンと比較することで、問題を解決できます。

編集:あなた繰り返しがあるときに真になりたいのですが、その逆ではありません。コードを編集しました。

def testlist(L):
    return sorted(set(L)) != sorted(L)
于 2012-10-28T11:54:33.977 に答える
2

あなたが使用することができcollections.Counter()ますany()

>>> lis=[3,5,3]
>>> c=Counter(lis)
>>> any(x>1 for x in c.values()) # True means yes some value is repeated
True
>>> lis=range(10)
>>> c=Counter(lis)
>>> any(x>1 for x in c.values()) # False means all values only appeared once
False

またはsets、長さを使用して一致させます。

In [5]: lis=[3,3,5]

In [6]: not (len(lis)==len(set(lis)))
Out[6]: True

In [7]: lis=range(10)

In [8]: not (len(lis)==len(set(lis)))
Out[8]: False
于 2012-10-28T11:54:13.430 に答える
2

セットを調べることができます。リストをループして、番号をサポート セットに追加するか、ループを抜け出します。

>>> l = [3, 5, 3]
>>> s = set()
>>> s
set([])
>>> for x in l:
...     if x not in s:
...         s.add(x)
...     else:
...         break

さらに一歩進んで、このコードから関数を作成し、見つかった最初の重複番号を返すこともできます (またはNone、リストに重複が含まれていない場合)。

def get_first_duplicate(l):
    s = set()
    for x in l:
        if x not in s:
            s.add(x)
        else:
            return x

get_first_duplicate([3, 5, 3])
# returns 3

それ以外の場合、「このリストには重複が含まれていますか?」という質問に対するブール値の回答が必要な場合は、重複要素の代わりにそれを返すことができます。

def has_duplicates(l):
    s = set()
    for x in l:
        if x not in s:
            s.add(x)
        else:
            return true
    return false

get_first_duplicate([3, 5, 3])
# returns True

センダーレは次のように指摘した。

このロジックを数行に圧縮するために人々が時々使用するイディオムがあります。必ずしもお勧めするわけではありませんが、知っておく価値はあります。

s = set(); has_dupe = any(x in s or s.add(x) for x in l)
于 2012-10-28T11:56:41.600 に答える
0

list変数に名前を付けてはいけません-listは Python のであり、そのような組み込みの名前をマスクするあらゆる種類の問題を自分自身に与えることができます。のようなわかりやすい名前を付けnumbersます。

そうは言っても...セットを使用して、すでに見た数字を追​​跡できます。

def first_double(seq):
    """Return the first item in seq that appears twice."""
    found = set()
    for item in seq:
        if item in found:
            return item
            # return will terminate the function, so no need for 'break'.
        else:
            found.add(item)

numbers = [3, 5, 3]
number = first_double(numbers)
于 2012-10-28T11:59:48.813 に答える
0

追加メモリなし:

any(l.count(x) > 1 for x in l)
于 2012-10-28T12:07:43.360 に答える