查找并更新列表中的重复项

2024-04-29 21:57:33 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在寻找一种Python式的方法来解决以下问题。我有一个可行的解决方案,但它有复杂的流控制,只是不“漂亮”。(基本上,C++解决方案)

我有一张单子。每个列表包含多个不同类型的项目(每个列表可能有10个项目)。列表的总体顺序并不相关,但任何单个列表中项目的顺序都很重要。(我改不了)。在

我正在寻找一个额外的标签“我正在寻找一个额外的标签到列表的末尾”。但是,在这种情况下,“重复”列表是在多个预选字段中具有相等值的列表,但不是所有字段(没有“真正”重复项)。在

例如:如果这是5项列表中的原始数据,并且“复制”被定义为在第一个和第三个字段中具有相等的值:

['apple', 'window', 'pear', 2, 1.55, 'banana']
['apple', 'orange', 'kiwi', 3, 1.80, 'banana']
['apple', 'envelope', 'star_fruit', 2, 1.55, 'banana']
['apple', 'orange', 'pear', 2, 0.80, 'coffee_cup'] 
['apple', 'orange', 'pear', 2, 3.80, 'coffee_cup']

第一、第四和第五份名单是重复的,因此所有名单应更新如下:

^{pr2}$

谢谢你的帮助和指导。我认为这可能超出了学习Python的范围。在


Tags: 项目方法apple列表顺序标签解决方案单子
3条回答

以下是我的解决方案(注释代码):

import itertools

l = [
        ['apple', 'window', 'pear', 2, 1.55, 'banana'],
        ['apple', 'orange', 'kiwi', 3, 1.80, 'banana'],
        ['apple', 'envelope', 'star_fruit', 2, 1.55, 'banana'],
        ['apple', 'orange', 'pear', 2, 0.80, 'coffee_cup'],
        ['apple', 'orange', 'pear', 2, 3.80, 'coffee_cup']
    ]

#Here you can select the important fields 
key = lambda i: (i[0],i[2])

l.sort(key=key)
grp = itertools.groupby(l, key=key)
#Look at itertools documentation
grouped = (list(j) for i,j in grp)

for i in grouped:
    if len(i) == 1:
        i[0].append(0)
    else: #You want duplicates to start from 1
        for pos, item in enumerate(i, 1):
            item.append(pos)

#Just a little loop for flattening the list
result = [] 
for i in grouped:
    for j in i:
        result.append(j)

print(result)

输出:

^{pr2}$
from collections import defaultdict

lists = [['apple', 'window', 'pear', 2, 1.55, 'banana'],
['apple', 'orange', 'kiwi', 3, 1.80, 'banana'],
['apple', 'envelope', 'star_fruit', 2, 1.55, 'banana'],
['apple', 'orange', 'pear', 2, 0.80, 'coffee_cup'],
['apple', 'orange', 'pear', 2, 3.80, 'coffee_cup']]

dic = defaultdict(int)
fts = []
for lst in lists:
    first_third = lst[0], lst[2]
    dic[first_third] += 1
    if dic[first_third] == 2: fts.append(first_third)
    lst.append(dic[first_third])

for lst in lists:
    if (lst[0], lst[2]) not in fts:
        lst[-1] -= 1

print(lists)

编辑:谢谢尤德米尔。first_third = lst[0], lst[2]是正确的,不是{}

编辑2:为了清楚起见,更改了变量名。在

编辑3:为了反映原海报真正想要的,以及他更新的名单。再也不漂亮了,想要的改变只是一种附属品。在

最好的办法是首先使用itemgetter()对列表进行排序,以选择要匹配的字段key。这将导致所有匹配的关键字段显示在一起,以便可以轻松地对它们进行比较和标记。例如,匹配第一个和第三个字段的排序是:

lst.sort(key=itemgetter(0, 2))

每一项与前一项的比较是直截了当的。在

好的,下面是完整的解决方案(使用itemgetter和groupby):

^{pr2}$

下面是一个示例测试运行以显示用法:

^{3}$

相关问题 更多 >