2

次のように作成されたリストのリストがあります

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

そして、次のような別のリストがあります

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

したがって、小さなリストの項目が大きなリストの特定のインデックスに含まれているかどうかを確認したいと思います。

だから、作る

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

そのため、smalllist の最初のサブリストの 'C' が biglist の最初のサブリストに追加されました。しかし、2番目と3番目ではありません。

のようにしてみました

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
[list(set(s+b)) for (s,b) in zip(smalllist,biglist)]
于 2013-07-13T20:57:06.407 に答える
2

何らかの理由でextend、Python では拡張後にリスト自体が返されません。だからllあなたの場合はNoneです。ループの 2 行目を追加するだけ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'}]
于 2013-07-13T20:46:00.197 に答える