2017-09-26 7 views
1

申し訳ありませんが、私はそれが時間の限られたこのscript..I'veため、すでにいくつかのコード以下のように書かれたように、かなり簡単なものだ場合は、この質問をする必要があること:pythonを使って複数のリストを複数のdictに結合するには?

localNames = re.findall(r"<\*\[local-name\(\)='.*?'.*?\/@\*\[name\(\)='.*?'.*?'\]", str(nontransTagsContent[0])) 
for i in localNames: 
tags = re.findall(r"local-name\(\)='(.*?)'", i) 
attributes = re.findall(r"name\(\)='(.*?)'", i) 

そしてprint(tags)ための結果は以下の通りです:

['tag1'] 
['tag2', 'tag3', 'tag4'] 
['tag5', 'tag6'] 

print(attributes)のための結果は以下の通りです:

['attribute1', 'attribute2', 'attribute3', 'attribute4'] 
['attribute5', 'attribute6'] 
['attribute7', 'attribute8', 'attribute9'] 

私が取得したい結果がdictioです

{'tag1':['attribute1', 'attribute2', 'attribute3','attribute4'} 
{'tag2':['attribute5', 'attribute6']} 
{'tag3':['attribute5', 'attribute6']} 
{'tag4':['attribute5', 'attribute6']} 
{'tag5':['attribute7', 'attribute8', 'attribute9']} 
{'tag6':['attribute7', 'attribute8', 'attribute9']} 

私はこのようにデータを抽出して他の形式に書き込むことができるので、データを簡単に操作できます。以下は私が試したコードです:

for x in tags: 
    dict = zip(tags, attributes) 
    print (list(dict)) 

しかし、出力が正しくないようです。あなたはそれを見て、これを修正する方法を見るのを手伝ってくれますか...ありがとう!

+0

1行あたりのタグと属性*は一意であることが保証されていますか?言い換えれば、 '' attribute1''はline1でのみ発生しますか? –

+0

あなたの 'localNames'コンテンツを投稿してください – RomanPerekhrest

+0

それは良い質問です。私はタグが一意でなければならないと思うが、属性はそうではないかもしれない。 – Penny

答えて

2
tags=[ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'], 
    ] 

    attributes=[ 
       ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
       ['attribute5', 'attribute6'], 
       ['attribute7', 'attribute8', 'attribute9'], 
      ] 

    for idx, tag_line in enumerate(tags): 
    for tag in tag_line: 
     print {tag : attributes[idx]} 

出力:

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag2': ['attribute5', 'attribute6']} 
{'tag3': ['attribute5', 'attribute6']} 
{'tag4': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9']} 
{'tag6': ['attribute7', 'attribute8', 'attribute9']} 

したい場合は辞書には1つのリスト内のすべてのタグ

from itertools import repeat 
    for tag, attr in zip(tags,attributes): 
    print dict(zip(tag, repeat(attr,len(tag)))) 

出力があります。

{'tag1': ['attribute1', 'attribute2', 'attribute3', 'attribute4']} 
{'tag4': ['attribute5', 'attribute6'], 'tag2': ['attribute5', 'attribute6'], 'tag3': ['attribute5', 'attribute6']} 
{'tag5': ['attribute7', 'attribute8', 'attribute9'], 'tag6': ['attribute7', 'attribute8', 'attribute9']} 

追加要求:

を210
tags, attributes = [], [] 
for i in localNames: 
    tags.append(re.findall(r"local-name\(\)='(.*?)'", i)) 
    attributes.append(re.findall(r"name\(\)='(.*?)'", i)) 
+0

答えをありがとう - 私はあなたの例のようなタグと属性をリストにすることができますか?今私が得た印刷タグは、私の質問で示したものと同じです。 – Penny

+0

@ペニー私の更新を参照してください – galaxyan

+0

こんにちは@ galaxyanは本当にありがとう!非常に有望です!私は追加のリクエストコードを試してみて、属性を印刷すると、いくつかの別々のリストを最後に印刷してすべてを印刷します。これはあなたの例と同じ/必要なものです。私は今必要なものだけを印刷する方法を見つけようとしています... – Penny

1

辞書を明示的に作成すると、これをより簡単かつ明確に行うことができます。 zipは辞書を作成しません。

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

dict_list = [] 
for t_list, a_list in zip(tags, attributes): 
    for t in t_list: 
     dict_list.append({t: a_list}) 
     print(dict_list[-1]) 
+0

答えをありがとう - 私はあなたの例のようなタグと属性をリストにすることができますか?今私が得た印刷タグは、私の質問で示したようなものです... – Penny

+0

私の例では、タグと属性は 'dicts'というリストに格納されています。私は 'dict_list'に名前を変更して、それがより明確になるようにします。 –

+0

答えをありがとう!私はあなたのコードを明日読んでいます! – Penny

0

あなたは、ネストされたmapsを適用することによって、これを達成することができます

map(
    lambda x: map(
     lambda y: {y: attributes[x[0]]}, 
     x[1] 
    ), 
    enumerate(tags) 
) 
+0

これを実行しようとしましたが、 'TypeError:()が見つかりませんでした。1必要な位置引数: 'x'' – Conic

+0

@Conic答えを更新しました。このソリューションのパフォーマンス予測を楽しみにしています! –

+0

私は、属性、タグを受け取り、辞書を返す関数としてこれを注意深く言い換えようとしています。私は、パフォーマンスの見積もりを大幅に変更する可能性のあるいくつかのステップがあることに気付きました。あなたが気にしないなら、地図を辞書に変える方法を見つけることができますか? – Conic

1

ワンライナー:

guten_tag = { tag: attributes[i] for i, tag_group in enumerate(tags) for tag in tag_group} 

あなたはtags呼ばリストおよびその他のようattributesと呼ばれるリストを持っていることを確認してください例。

tags = [ 
    ['tag1'], 
    ['tag2', 'tag3', 'tag4'], 
    ['tag5', 'tag6'] 
] 

attributes = [ 
    ['attribute1', 'attribute2', 'attribute3', 'attribute4'], 
    ['attribute5', 'attribute6'], 
    ['attribute7', 'attribute8', 'attribute9'] 
] 

速度比較:

galaxy_an答えは1000000 loops1.05 µs per looptimeitモジュールを使用している

jeremy答えは1000000 loops1.21 µs

guten_tag(チtimeitモジュールを使用していますS法)µs10^-6nano10^-9あるtimeitモジュール

を用い1000000 loops850 ns per loopあります。

非常に浅いレベルでは、パフォーマンスが2〜3桁向上します。

関連する問題