比较Python中列表列表中的元素

时间:2017-01-20 05:25:25

标签: python list duplicates row multiple-columns

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

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'的行应该只包含一次)

我怎样才能做到这一点?

4 个答案:

答案 0 :(得分:1)

您当前的代码失败,因为在第一次迭代后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]]

答案 1 :(得分: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 :(得分:0)

使用列表理解来实现这一目标:

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

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

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

  

字典对于你的案例来说是完美的数据结构。

答案 3 :(得分:0)

我认为当你循环杉木时,你应该添加一个列表来记录你在秒中放入的密钥。