【问题标题】:Add the duplicate in another list在另一个列表中添加重复项
【发布时间】:2021-10-08 05:26:03
【问题描述】:

我想将一个列表中的重复项放在另一个列表中。在下面的示例中,我试图创建一个列表red_dup,其中包含每个包含重复的“红色”ID 的项目。同样,我想对food_dup 列表中的每种食物做同样的事情。

我有什么:

values = [[1, 'red1', 'food4'], [1, 'red2', 'food4'], [1, 'red1', 'food9']]

我正在寻找的结果:

red_dup = [[1, 'red1', 'food4'], [1, 'red1', 'food9']]
food_dup = [[1, 'red1', 'food4'], [1, 'red2', 'food4']]

在我的代码中,“值”来自一个类的生成器函数。

函数返回这些values

1为距离,红色或蓝色为实体与食物的距离。

This 是代码返回的内容。红色下划线为 X、Y 坐标。

【问题讨论】:

  • 我只有来自生成器函数的未经处理的变量“值”。
  • 我将编辑显示代码的帖子。
  • 完成,我编辑了

标签: python arrays duplicates


【解决方案1】:

您可以使用 dict 来存储和过滤重复值

from collections import defaultdict
res = defaultdict(list)
for item in values:
    _, color, food = item 
    res[color].append(item)
    res[food].append(item)
    

[v for v in res.values() if len(v) > 1]

结果:

[[[1, 'red1', 'food4'], [1, 'red1', 'food9']],
 [[1, 'red1', 'food4'], [1, 'red2', 'food4']]]

【讨论】:

  • 行得通,谢谢,你能解释一下[v for v in res.values() if len(v) > 1]我是初学者,不知道这种类型的“for”循环
  • @Guildc12 这称为“列表理解”。它只是说“对于列表 res.values() 中的每个元素,如果它的长度大于 1,则将其放入最终列表中 - 意味着它已被复制。”
【解决方案2】:

这是我的建议:

values = [[1, 'red1', 'food4'], [1, 'red2', 'food4'], [1, 'red1', 'food9']]

red_dup = []
food_dup = []

for i in values:
    red=[k for k in values if k[1]==i[1]]
    if len(red)>1:
        red_dup.extend(red)
    food = [k for k in values if k[2]==i[2]]
    if len(food)>1:
        food_dup.extend(food)

red_dup=sorted(red_dup, key=lambda x: [x[1], x[2]])[::2]
food_dup=sorted(food_dup, key=lambda x: [x[2], x[1]])[::2]

>>>print(red_dup)
#[[1, 'red1', 'food4'], [1, 'red1', 'food9']]
>>>print(food_dup)
#[[1, 'red1', 'food4'], [1, 'red2', 'food4']]

【讨论】:

  • 我使用了 DefaultDicts,但是,谢谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-08-18
  • 1970-01-01
  • 1970-01-01
  • 2020-01-08
相关资源
最近更新 更多