【问题标题】:Efficient deduplication in PythonPython 中的高效重复数据删除
【发布时间】:2021-12-26 04:17:12
【问题描述】:

我已经编写了一个小代码谁属性,一个列表的每个元素,一个分数...要做到这一点,我需要这样做(简化代码):

group={1:["Jack", "Jones", "Mike"],
       2:["Leo", "Theo", "Jones", "Leo"],
       3:["Tom", "Jack"]}

already_chose=["Tom","Mike"]
result=[]

for group_id in group:
    name_list = group[group_id]
    y=0;x=0
    repeat=[]
    for name in name_list:
        if name in already_chose:
            y+=1
        elif name not in repeat:
            x+=1
            repeat.append(name)
    score_group=x-y
    result.append([group_id,score_group])

输出:[[1, 1], [2, 3], [3, 0]]

如果您阅读此代码,问题在于,它并未针对大枚举(超过 7000 个组和 100 个组名)进行优化...

我希望有人可以帮助我吗?非常感谢

【问题讨论】:

  • 你想在这里做什么?
  • 很难说你的最终结果应该是什么。对于简单的优化,请使用集合而不是 already_chose 的列表...
  • 我尝试为每个团队分配一个分数(由 x 和 y 设置)
  • x 在我们第一次看到这个名字时得到 +1 如果名字已经在选择列表中,你得到 +1

标签: python list optimization mathematical-optimization enumeration


【解决方案1】:

IIUC,您想得到不在already_chose 中的唯一名称集的长度减去already_chose 中的名称数。

这很容易通过 python 集合和列表理解来实现。使用 python 集合的优点是,由于元素的散列,操作非常快。

[[k, len(set(v).difference(already_chose))-len(set(v).intersection(already_chose))]
 for k,v in group.items()]

输出:[[1, 1], [2, 3], [3, 0]]

注意。作为字典理解可能更有用:

{k: len(set(v).difference(already_chose))-len(set(v).intersection(already_chose))
 for k,v in group.items()}

输出:{1: 1, 2: 3, 3: 0}

【讨论】:

  • 我不知道 set().difference() !!!!想
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-21
  • 2019-05-12
  • 2012-03-05
  • 1970-01-01
  • 2021-12-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多