我有一个列表列表,如下所示:
[[[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
答案 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