2

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

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

我会有另一个清单,比如

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

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

所以,使

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

因此,smalllist 的第一个子列表中的“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

怎么做?

谢谢

4

3 回答 3

5

也许,你应该试试这个:

// 这只有在 smalllist 比 biglist 短时才有效

脚本:

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']]
于 2013-07-13T20:43:49.247 回答
2

出于某种原因,extendPython 在扩展后不会返回列表本身。所以ll在你的情况下是None. 只需将ll=each[0]第二行放在循环中,您的解决方案就应该开始工作了。

尽管如此,我还是不明白,为什么你首先不将元素保留在sets 中。这将避免您必须从 to 转换list然后set向后转换。

我只是or设置而不是附加到列表,然后通过求助于然后过滤掉重复setlist

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

首先将元素保留在sets 中似乎是 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'}]
于 2013-07-13T20:46:00.197 回答
2
[list(set(s+b)) for (s,b) in zip(smalllist,biglist)]
于 2013-07-13T20:57:06.407 回答