2017-08-24 6 views
-1

からタプルのリストを構築は、私はこれらのようなリストの二つのリストを持つ2つのネストされたリストを効率的

[[('we', 'PRP'), ('could', 'VBP'), ('use', 'NNP'), ('that', 'NN')], [('salt', 'PRP'), ('water', 'NN')]] 

どのようにすることができますそれはメモリ効率的な方法で行うのですか?

+0

あなたが最初のリスト内の単語の前後に引用符を追加してくださいことはできますか?さもなければ、これは解決するために非常に面倒な問題になります。 –

+0

@cᴏʟᴅsnどのようにすべてのネストされたリストに対してそれを行いますか?はい、私はそれを行うことができます、私はタプルを構築するためにリストの理解を使用することができます。引用符を意図している場合は – 0x1

+0

は、あなたはおそらく 'ast.literal_eval'を使用する必要があると' zip' – MSeifert

答えて

0

あなたはすることができますいくつかをlist comprehensionssplit()と012を使用して達成する以下のような組み込み関数:

new_lista = [lista[i][2:-2].split() for i in range(len(lista))] 
new_listb = [listb[i][2:-2].split("', '") for i in range(len(listb))] 

res = [list(zip(a, b)) for a, b in zip(new_lista, new_listb)] 

出力:

>>> res 
[[('we', 'PRP'), ('could', 'VBP'), ('use', 'NNP'), ('that', 'NN')], [('salt', 'PRP'), ('water', 'NN')]] 
0

あなたはこれを試すことができます。

import itertools 

lista = ["['we could use that']", "['salt water']"] 

listb = ["['PRP', 'VBP', 'NNP', 'NN']", "['PRP', 'NN']"] 

lista = itertools.chain.from_iterable([[b.split() for b in eval(i)] for i in lista]) 
listb = [eval(i) for i in listb] 

final_list = [[(c, d) for c, d in zip(a, b)] for a, b in zip(lista, listb)] 

出力:

[[('we', 'PRP'), ('could', 'VBP'), ('use', 'NNP'), ('that', 'NN')], [('salt', 'PRP'), ('water', 'NN')]] 
1

あなたはリストの内包表記を使用し、その後、ast.literal_eval()でリストを解析することができ、例えば:

>>> from ast import literal_eval 
>>> lista = [literal_eval(x) for x in lista] 
>>> listb = [literal_eval(x) for x in listb] 
>>> [list(zip(a[0].split(), b)) for a, b in zip(lista, listb)] 
[[('we', 'PRP'), ('could', 'VBP'), ('use', 'NNP'), ('that', 'NN')], [('salt', 'PRP'), ('water', 'NN')]] 
1

はここより防弾ソリューションです。最初のリストは正規表現で解析されます。 ast.literal_evalを有する第二:

x1 = [str(x).split() for x in map(lambda x: re.sub(r"[\[\]']", '', x), lista)] 
x2 = map(ast.literal_eval, listb) 

res = [list(zip(a, b)) for a, b in zip(x1, x2)] 
print(res) 

出力:

[[('we', 'PRP'), ('could', 'VBP'), ('use', 'NNP'), ('that', 'NN')], 
[('salt', 'PRP'), ('water', 'NN')]] 
+0

あなたのresの時間の複雑さはn^2です。多分それをnに持っていくことは可能ですか? 0x1の@ – 0x1

+0

技術的にはない、反復はリストの画分のみで実行されるため。 [ZIP内の(x、y)のための(x、y)と(B)] –

+0

'も右、' 'だけリスト(ZIP(B))とすることができますか? – MSeifert

関連する問題