从列表中保留两个副本:如何从多个列表中保留两个相同的元素?

3
我有一个类似于以下内容的Python列表或列表:
[
['name1',value2],
['name2',value3],
['name3',value4],
['name4',value4],
['name5',value5],
['name6',value2],
['name7',value2],
['name8',value4]
]

我想要从“value”字段中移除任何列表,该列表中有超过2个重复项。最终的列表将如下所示:
[
['name1',value2],
['name2',value3],
['name3',value4],
['name4',value4],
['name5',value5],
['name6',value2]
]

编辑:
我没有想到这会成为一个问题,所以为了提出一个清晰的问题而保持简单,但实际上每个内部列表中有四个值而不是两个。例如:
[
['name1',value2,'something','else'],
['name2',value3,'something','else'],
['name3',value4,'something','else'],
['name4',value4,'something','else'],
['name5',value5,'something','else'],
['name6',value2,'something','else']
]

Ashwini Chaudhary的答案完美地解决了问题,但只返回了前两个元素而不是所有四个...这是我的错,因为我没有添加完整的细节。吸取了教训!
3个回答

2
这段代码可以解决问题:
from collections import defaultdict
def dup2(sequence):
    seen = defaultdict(int)
    for key, value in sequence:
        if seen[value] < 2:
            seen[value] += 1
            yield [key, value]

dup2是一个生成器,因此它会在你遍历结果时处理列表:

for key, value in dup2(seq):
    # ... your code here

要将结果呈现为简单列表,请使用list函数:
list(dup2(seq))

1

如果顺序不重要:

In [14]: lis=[
['name1','value2','something','else'],
['name2','value3','something','else'],
['name3','value4','something','else'],
['name4','value4','something','else'],
['name5','value5','something','else'],
['name6','value2','something','else']
]

In [22]: dic={}

In [23]: for x in lis:
    dic.setdefault(x[1],[]).append([x[0]]+x[2:])
   ....:     
   ....:     

In [25]: dic
Out[25]: 
{'value2': [['name1', 'something', 'else'], ['name6', 'something', 'else']],
 'value3': [['name2', 'something', 'else']],
 'value4': [['name3', 'something', 'else'], ['name4', 'something', 'else']],
 'value5': [['name5', 'something', 'else']]}

In [27]: [[y[0]]+[x]+y[1:] for x in dic for y in dic[x][:2]]
Out[27]: 
[['name5', 'value5', 'something', 'else'],
 ['name3', 'value4', 'something', 'else'],
 ['name4', 'value4', 'something', 'else'],
 ['name2', 'value3', 'something', 'else'],
 ['name1', 'value2', 'something', 'else'],
 ['name6', 'value2', 'something', 'else']]

工作得很完美,但是我的实际项目中有4个元素而不是两个(现在已添加到问题中。非常抱歉!)。我该如何获得所有四个结果并将其放入最终列表中,而不是只有两个? - john

0
from collections import defaultdict

list1 = [['name1','value2'],
         ['name2','value3'],
         ['name3','value4'],
         ['name4','value4'],
         ['name5','value5'],
         ['name6','value2'],
         ['name7','value2'],
         ['name8','value4']]

list2 = [['name1','value2'],
         ['name2','value3'],
         ['name3','value4'],
         ['name4','value4'],
         ['name5','value5'],
         ['name6','value2']]

d = defaultdict(list)
for name, value in list1:
    d[value].append(name)

list3 = [[name, value] for value, names in d.items() for name in names[:2]]

print(sorted(list3) == sorted(list2))  # True

我相信一定会有人提出更好的解决方案,既能保持顺序又能作为迭代器工作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接