查找,连接并删除python列表中的项目

时间:2015-02-26 08:50:20

标签: python python-3.x

我有一个列表列表,如下所示:

[[[1], [’apple’], [’AAA’]]
[[2], [’banana’], [’BBB’]]
[[3], [’orange’], [’CCC’]]
[[4], [’pineapple’], [’AAA’]]
[[5], [’tomato’], [’ABC’]]]

可能是错误的术语,但是:我想在第三列中找到重复项,将该行的第二列项添加到重复项的第一个实例,然后删除重复的行。

所以使用示例:我想迭代列表,找到重复值'AAA',在'pineapple'之后添加'apple'并删除包含第二个的第二级列表'AAA'的实例。

我想最终得到的列表应该如下:

[[[1], [’apple’, 'pineapple'], [’AAA’]]
[[2], [’banana’], [’BBB’]]
[[3], [’orange’], [’CCC’]]
[[5], [’tomato’], [’ABC’]]]

我尝试了以下但我无法弄清楚如何做到这一点..

seen = set()
for l in final:
    if l[2] not in seen: # TypeError: unhashable type: 'list'
        # Here I want to add value to first instance
        seen.add(l[2])
        # Remove list

2 个答案:

答案 0 :(得分:1)

这将满足您的要求......但我真的很想知道您是否无法更改数据结构。这很奇怪而且难以使用!

newList = []
lookup = {}
for l in final:
    if l[2][0] not in lookup:
        lookup[l[2][0]] = l
        newList.append(l)
    else:
        lookup[l[2][0]][1].append(l[1][0])

print newList

您获得TypeError的原因是您正在执行此操作l[2]而不是l[2][0]。请记住,l[2]是一个列表。你想要的是获取该列表中的项目(在这种情况下为索引0)并检查 是否在lookup中。 lookup替换了示例中实现的seen集,因为它还可以帮助返回重复的l[2][0]对应的条目,因为您的数据结构当前未设置为做final['AAA']之类的事情。但是,这不是很理想,如果可能的话,我强烈建议你做一些关于改变它的事情。

要考虑的其他事情......

目前,由于您的项目基本上都是列表中的列表,因此当前算法将基本上更改您正在使用的嵌套对象(列表),因为对象可变性。这意味着虽然final将包含它最初所执行的相同对象,但这些对象将发生更改(在本例中为['apple', 'pineapple'])。

如果您想防止这种情况发生,请查看使用copy模块。具体来说,使用deepcopy方法复制所有对象(甚至通过嵌套)。

编辑:

w0lf的版本 (提高了可读性)

newList = []
lookup = {}
for l in final:
    row_no, fruit, code = l
    unique_id = code[0] # because `code` is a one element list
    if unique_id not in lookup:
        lookup[unique_id] = l
        newList.append(l)
    else:
        lookup[unique_id][1].extend(fruit)

print(newList)

另请注意:他记得为Py3k用户执行print(newList)而不是print newList。由于这个问题是为Python 3标记的,所以就是这样。

答案 1 :(得分:0)

List是不可用的类型,即你不能将它(按原样)添加到使用散列映射的数据结构(如python dictionary或set)。但字符串是可以清洗的。 我会做

seen.add(str(ls[2]))

这将解决TypeError