find、indexing、slicing、len()などのメソッドのみを使用し、dict、tupleなどを使用せずに重複が含まれている場合、p = [1,2,3,4,2]
bool値を返す方法はありますか?というリストがあります。True
私はこのコードを使用しました:
for e in p:
duplicate = p.find(e, e+1)
if duplicate in p:
return True
find、indexing、slicing、len()などのメソッドのみを使用し、dict、tupleなどを使用せずに重複が含まれている場合、p = [1,2,3,4,2]
bool値を返す方法はありますか?というリストがあります。True
私はこのコードを使用しました:
for e in p:
duplicate = p.find(e, e+1)
if duplicate in p:
return True
簡単な方法は次のとおりです。
return len(p) != len(set(p))
を使用しない効率の悪い方法set
:
for i in range(len(p)):
if p[i] in p[i+1:]:
return True
return False
この2番目のアプローチはあまり慣用的ではありませんが、言語の最も基本的な機能(タプルを含む)を除いてすべてを回避します。
もう1つの方法があります:
while p:
e = p.pop()
if e in p:
return True
return False
これは簡単ですが、リストを変更します。
最後に説明する方法は次のとおりです。
s = sorted(p)
for i in range(1, len(s)):
if s[i] == s[i - 1]:
return True
return False
これp
は、連続する要素のすべてのペアを並べ替えてから比較することで機能します。
また、使用することができますlist.count
:
def has_duplicates(p):
for e in p:
if p.count(e) > 1:
return True
return False
>>> p = [1, 2, 3, 4, 2]
>>> len(set(p)) == len(p)
False
セットの詳細については、Pythonのドキュメントをご覧ください。
この方法でそれを行う必要がある場合は、次のことができます。
def has_duplicates(lst):
for i, e in enumerate(lst[::-1]):
if lst.index(e) != len(lst) - i - 1:
return True
return False
これは、リストを逆の順序で繰り返します(index
リストの先頭から検索するため)。しかし、単純に次のことを行う方がよいでしょう。
def has_duplicates(lst):
return len(set(lst)) != len(lst)
collections.Counterを使用する
>>> import collections
>>> p
[1, 2, 3, 4, 2]
>>> if collections.Counter(p).most_common()[0][1] > 1:
... print('duplicate found')
...
duplicate found
>>> if collections.Counter(set(p)).most_common()[0][1] > 1:
... print('duplicate found')
...
>>>
これを行う非常に簡単な方法があります。非常に大きなリストの場合は遅くなる可能性があります。
def has_duplicates(lst):
for e in lst:
lst = lst[1:]
if e in lst: return True
return False