【问题标题】:python find duplicate lists in list of lists [duplicate]python在列表列表中查找重复列表[重复]
【发布时间】:2013-06-05 12:11:24
【问题描述】:

我正在使用 python 2.7,我正在尝试根据两个值在列表列表中查找重复列表。 例如

list= [[a,x,y,2], [b,xx,yy,2], [c,xxx,yyy,3],[a,yx,yx,2]]

outcome [[a,xyx,yyx,2], [b,xx,yy,2], [c,xxx,yyy,3]]

所以基于值a和2,加入其他值

有什么建议吗??

谢谢 最好的问候

【问题讨论】:

  • 您已经尝试过哪些解决方案?也许这个模块可以帮助你:docs.python.org/library/…
  • 上一个问题的答案也应该非常适合这个问题。简而言之:遍历外部列表,从内部列表中创建第一个和最后一个值的元组,然后检查该元组是否在一组可见对中。
  • @Blckknght -- 这略有不同。在这里,OP 想要合并列表,因此 dictset 更合适,因为 dict 可以让您轻松处理要合并的列表。
  • @mgilson:啊,我明白了。我没有仔细阅读,错过了xyxyyx位。

标签: python list


【解决方案1】:

如果顺序无关紧要,我想你可以使用字典:

from operator import itemgetter
getter = itemgetter(0,-1)

def merge(lst1,lst2):
    return [lst1[0],lst1[1]+lst2[1],lst1[2]+lst2[2],lst1[3]]


d = {}
for sublist in lst:
    t = getter(sublist)
    if t not in d:
       d[t] = sublist
    else:
       d[t] = merge(sublist,d[t])

print d.values()

如果顺序很重要,您可以改用collections.OrderedDict

【讨论】:

  • 应该是(0, -1)
  • @jamylak -- 你是对的。昨天下午,我在 Fortran 上工作的时间比平时长了一点。显然我忘了把我的想法一直切换回 0 索引。 :)
  • 你在哪里可以找到 2013 年的 fortran 遗留产品?
  • @ZagorulkinDmitry -- 在本月底之前,我都是一名科学家。我们仍然经常使用 Fortran。 :)。 (而且,FWIW,我认为 Fortran 实际上是一种非常简洁的语言——数组操作的语法非常简单和干净。numpy 中的很多东西(例如数组切片)都是从 Fortran 语法中借用的。)
  • 不是我想要的,但很快就会派上用场:)thanx
【解决方案2】:
from collections import OrderedDict
lis =  [['a','x','y',2], ['b','xx','yy',2], ['c','xxx','yyy',3],['a','yx','yx',2]]
dic = OrderedDict()
for x in lis:
   key = (x[0],x[-1])
   if key not in dic:
      dic[key] = x[1:-1]
   else:
      val =  dic[key]
      dic[key] = [a+b for a,b in zip(val,x[1:-1])]

print [[k[0]] + v + [k[1]] for k,v in dic.items()]

输出:

[['a', 'xyx', 'yyx', 2], ['b', 'xx', 'yy', 2], ['c', 'xxx', 'yyy', 3]]

【讨论】:

    猜你喜欢
    • 2021-10-19
    • 2021-01-23
    • 1970-01-01
    • 2013-11-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    相关资源
    最近更新 更多