1

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
4

6 に答える 6

6

簡単な方法は次のとおりです。

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は、連続する要素のすべてのペアを並べ替えてから比較することで機能します。

于 2013-03-04T16:05:20.937 に答える
5

また、使用することができますlist.count

def has_duplicates(p):
    for e in p:
        if p.count(e) > 1:
            return True
    return False
于 2013-03-04T16:04:59.373 に答える
2
>>> p = [1, 2, 3, 4, 2]
>>> len(set(p)) == len(p)
False

セットの詳細についてはPythonのドキュメントをご覧ください。

于 2013-03-04T16:05:11.107 に答える
1

この方法でそれを行う必要がある場合は、次のことができます。

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)
于 2013-03-04T16:03:53.473 に答える
1

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')
... 
>>> 
于 2013-03-04T16:18:52.277 に答える
0

これを行う非常に簡単な方法があります。非常に大きなリストの場合は遅くなる可能性があります。

def has_duplicates(lst):
    for e in lst:
        lst = lst[1:]
        if e in lst: return True
    return False
于 2013-03-04T16:06:28.773 に答える