【问题标题】:Compare elements inside list of lists in Python比较Python中列表列表中的元素
【发布时间】:2017-01-20 05:25:25
【问题描述】:

我正在尝试通过删除现有列表列表中具有重复值的行来创建新的列表列表。

fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
sec = []

for row in fir:
    if sec is None:
        sec.append(row)
    elif row[0] not in sec:
        sec.append(row)

print(sec)

预期输出: [['a35', 1], ['3r', 6], [5, 9]]

实际输出: [['a35', 1], ['a35', 2], ['3r', 6], ['3r', 8], [5, 9]]

我想创建一个列表列表,其中 row[0] 的值是唯一且不重复的(例如,带有 'a35' 的行应该只包含一次)

我怎样才能做到这一点?

【问题讨论】:

    标签: python list duplicates row multiple-columns


    【解决方案1】:

    您可以简单地保存唯一值(元组中的第一个数据),您错了,因为您将第一个元组与所有数据进行比较(比较 'a35' 和 ['a35',1])

    fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
    sec = []
    
    index = []
    for f in fir:
        if not f[0] in index:
            index.append(f[0])
            sec.append(f)
    
    print(sec)
    

    【讨论】:

      【解决方案2】:

      您当前的代码失败,因为在第一次迭代后sec 看起来像这样:[['a35',1]]。在第二次迭代中,row 的值为 ['a35',2],无法从 sec 中找到,因此它被附加到那里。

      您可以使用groupby 根据第一个元素对内部列表进行分组。 groupby 返回 (key, it) 元组的可迭代对象,其中 key 是第二个参数返回的值,it 是组内元素的可迭代对象:

      >>> from itertools import groupby
      >>> fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9]]
      >>> [next(g) for _, g in groupby(fir, lambda x: x[0])]
      [['a35', 1], ['3r', 6], [5, 9]]
      

      请注意,上面假设具有相同第一个元素的列表在seq 中彼此相邻。如果不是这种情况,您可以在将seq 传递给groupby 之前对其进行排序,但这仅在第一个元素可以用作键时才有效。您的数据并非如此,因为存在无法在 Python 3 上比较的字符串和整数。不过,您可以将这些项目收集到 OrderedDict

      from collections import OrderedDict
      fir = [['a35',1],['a35',2],['3r',6],['3r',8],[5,9],['a35',7]]
      
      d = OrderedDict()
      for x in fir:
          d.setdefault(*x)
      
      print([list(x) for x in d.items()])
      

      输出:

      [['a35', 1], ['3r', 6], [5, 9]]
      

      【讨论】:

        【解决方案3】:

        使用列表理解来实现:

        sec=[i for i in fir if i[0] not in [fir[idx][0] for idx in xrange(0,fir.index(i))]]
        

        这会从fir 中选择每个项目,并将该项目的第一个元素与索引0 中的所有项目进行比较,直到该项目的索引。

        由于内部列表中只有两个项目,并且您不希望有重复项,

        字典将是您案例的完美数据结构。

        【讨论】:

          【解决方案4】:

          我认为当你循环冷杉时,你应该添加一个列表来记录你在秒中放了哪个键。

          【讨论】:

            猜你喜欢
            • 2020-09-20
            • 1970-01-01
            • 1970-01-01
            • 2017-03-12
            • 2023-04-03
            • 1970-01-01
            • 2015-08-01
            • 2014-01-07
            • 1970-01-01
            相关资源
            最近更新 更多