1

我有一个列表说p = [1,2,3,4,2] 是否有任何方法可以返回 bool 值True,如果它包含仅使用 find、索引、切片、len() 等方法而不是 dict、tuple 等方法的重复项。

我使用了这段代码:

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

第二种方法不是很惯用,但是除了最基本的语言特性(包括元组)之外,它避免了所有的特性。

这是另一种方法:

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

使用 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 回答
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 回答
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 回答