按位置搜索另一列表中的子列表项

时间:2013-07-13 20:39:35

标签: python list

我有一个创建列表的列表,如

biglist=[['A'], ['C', 'T'], ['A', 'T']]

我将有另一个列表,如

smalllist=[['C'], ['T'], ['A', 'T']]

所以,我想检查一下小清单中的项目是否包含在该列表的特定索引中,如果没有附加到该列表中。

所以,制作

biglist=[['A','C'], ['C', 'T'], ['A', 'T']]

所以,小名单的第一个子列表中的'C'被添加到biglist的第一个子列表中。但不是第二和第三。

我试过

dd=zip(biglist, smalllist)
for each in dd:
    ll=each[0].extend(each[1])
    templist.append(list(set(ll)))

但得到错误

templist.append(list(set(ll)))
TypeError: 'NoneType' object is not iterable

怎么做?

谢谢

3 个答案:

答案 0 :(得分:5)

可能你应该试试这个:

//这只会在小名单短于大名单

的情况下起作用

<强> SCRIPT:

biglist   = [['A'], ['C', 'T'], ['A', 'T']]
smalllist = [['C'], ['T'], ['A', 'T']]

for i, group in enumerate(smalllist):
    for item in group:
        if item not in biglist[i]:
            biglist[i].append(item)

<强>样本:

print(biglist)
# [['A', 'C'], ['C', 'T'], ['A', 'T']]

答案 1 :(得分:2)

由于某些原因,Python中的extend在扩展后不会返回列表本身。因此,ll就是None。只需将ll=each[0]放在循环的第二行,您的解决方案就应该开始工作了。

但是,我没有得到,为什么你不把你的元素放在set s中。这样可以避免您必须从list转换为set然后转换回来。

我只会or设置而不是附加到列表中,然后通过set然后转到list来过滤掉重复项。

>>> from itertools import izip
>>> templist = []
>>> for els1,els2 in izip(biglist,smalllist):
    joined = list(set(els1) | set(els2))
    templist.append(joined)


>>> templist
[['A', 'C'], ['C', 'T'], ['A', 'T']]

首先将set s中的元素保存在Python 3中似乎是最快的,即使每组中的元素数量很少(参见注释):

biglist=[set(['A']), set(['C', 'T']), set(['A', 'T'])]
smalllist=[set(['C']), set(['T']), set(['A', 'T'])]

for els1,els2 in zip(biglist,smalllist):
    els1.update(els2)

print(biglist)

输出继电器:

[{'A', 'C'}, {'C', 'T'}, {'A', 'T'}]

答案 2 :(得分:2)

[list(set(s+b)) for (s,b) in zip(smalllist,biglist)]