1

我不知道如何确切地解释这个标题,所以这里有一些代码来表达我的需要。我有一个这样的列表:

lst = [['24', 'john', 'july, 'email@gmail.com],
       ['12', 'alice', 'auguts, 'email@hotmail.com],
       ['48', 'john', 'september, 'email@outlook.com],
       [ ....]]

我想删除所有具有相同名称的重复子列表(名称是每个子列表中的第二个字段),在这种情况下,我希望最终列表为:

lst = [['24', 'john', 'july, 'email@gmail.com],
       ['12', 'alice', 'auguts, 'email@hotmail.com]
       [ ....]]

我不想找到重复的列表并将其删除,我想删除具有重复字段的列表。对不起,如果我没有很好地解释自己。

谢谢!

4

3 回答 3

4

用于set检查重复项。

>>> lst = [
...     ['24', 'john', 'july', 'email@gmail.com'],
...     ['12', 'alice', 'auguts', 'email@hotmail.com'],
...     ['48', 'john', 'september', 'email@outlook.com'],
... ]
>>> 
>>> seen = set()
>>> result = []
>>> for item in lst:
...     name = item[1]
...     if name not in seen:
...         seen.add(name)
...         result.append(item)
... 
>>> result
[['24', 'john', 'july', 'email@gmail.com'],
 ['12', 'alice', 'auguts', 'email@hotmail.com']]

不要list用作变量名。它会影响内置list的 .

>>> seen = set()
>>> [x for x in lst if (x[1] not in seen, seen.add(x[1]))[0]]
[['24', 'john', 'july', 'email@gmail.com'],
 ['12', 'alice', 'auguts', 'email@hotmail.com']]
于 2013-09-03T03:07:52.147 回答
1

使用过滤器:

lst = [['24', 'john', 'july', 'email@gmail.com'],
       ['12', 'alice', 'auguts', 'email@hotmail.com'],
       ['48', 'john', 'september', 'email@outlook.com']
       ]
seen = {}
def filter_condition(item):
    if item[1] in seen: return False
    seen[item[1]] = 1 
    return True

print filter(filter_condition, lst)
于 2013-09-03T03:32:17.450 回答
0

这是一种天真的方法,重命名您的起始列表oldlist以避免内置 Python 的命名问题list

newlist = []
for j, sublist in enumerate(oldlist):
  unique = True
  for laterlist in oldlist[j+1:]:
    if any([sublist[k] == laterlist[k] for k in range(len(sublist))]):
      unique = False
  if unique:
    newlist.append(sublist)
于 2013-09-03T03:05:21.943 回答