在Python中比较列表中的元素

2024-06-26 10:35:47 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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]]

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

我怎样才能做到这一点?在


Tags: innone列表forifisnotsec
3条回答

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

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

>>> 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之前对其进行排序,但这只在第一个元素可以用作键的情况下有效。对于您的数据,情况并非如此,因为在Python3上有无法比较的字符串和整数。您可以将项目收集到OrderedDict,但是:

^{pr2}$

输出:

^{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中的所有项进行比较,直到该项的索引为止。在

因为你在内部列表中只有两项,你不想有重复项

Dictionary would have been the perfect data structure for your case.

您可以简单地保存唯一值(元组中的第一个数据),这是错误的,因为您将第一个元组与所有数据进行比较(比较'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)

相关问题 更多 >