5

私は2つのリストを持っています:

header = ["Name", "Age"]
detail = ["Joe", 22, "Dave", 43, "Herb", 32]

そして、次のような独裁者のリストを作成したいと思います。

[{"Name": "Joe", "Age": 22}, {"Name": "Dave", "Age": 32}, {"Name": "Herb", "Age": 32}]

このメソッドzipは部分的にそこに到達しますが、ディクショナリに最初の値のセットを追加するだけです。

>>> dict(zip(header, detail))
{'Age': 22, 'Name': 'Joe'}

detailリスト内のすべての値に対して1つのディクショナリとして出力するにはどうすればよいですか?私はこの答えdetailを見つけましたが、これはネストされたリストを含むことに依存します。

4

4 に答える 4

8
>>> detail = ["Joe", 22, "Dave", 43, "Herb", 32]
>>> d = dict(zip(detail[::2], detail[1::2]))
>>> d
{'Herb': 32, 'Dave': 43, 'Joe': 22}

新しい/編集された質問の場合:

>>> d = [dict(zip(header, items)) for items in zip(detail[::2],detail[1::2])]
>>> d
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'H
erb'}]
于 2012-10-02T14:24:29.700 に答える
2

これを取得する方法の 1 つを次に示します。

header = ["Name", "Age"]
detail = ["Joe", 22, "Dave", 43, "Herb", 32]
data_iter = iter(detail)
collated = []
while True:
    next_data = zip(header, data_iter)
    if not next_data:
        break
    collated.append(dict(next_data))

出力は

[{'Age': 22, 'Name': 'Joe'},
 {'Age': 43, 'Name': 'Dave'},
 {'Age': 32, 'Name': 'Herb'}]

このバージョンには、ヘッダーの数を変更する場合にコードを変更する必要がないという利点があります。

于 2012-10-02T14:38:23.267 に答える
2

そのようなタスクについては、機能的なアプローチを好みます。

ハタのレシピは次のとおりです。

def grouper(n, iterable, fillvalue=None):
    "Collect data into fixed-length chunks or blocks"
    # grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

detailそれを使用することで、次のグループごとにトラフを進めることができ2ます。

>>> groups = grouper(len(header),detail)
>>> list(groups)
[('Joe', 22), ('Dave', 43), ('Herb', 32)]

そして、この反復子を使用して、必要に応じて辞書を作成できます。

>>> [dict(zip(header,group)) for group in groups]
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'Herb'}]

明確にするために、zip(header,group)これを与えます:

>>> zip(["Name", "Age"],('Joe', 22))
[('Name', 'Joe'), ('Age', 22)]

そして召喚dictコンストラクターはこれを与えます:

>>> dict([('Name', 'Joe'), ('Age', 22)])
{'Age': 22, 'Name': 'Joe'}
于 2012-10-02T14:51:24.947 に答える
1
>>> header = ["Name", "Age"]
>>> detail = ["Joe", 22, "Dave", 43, "Herb", 32]
>>> [dict(zip(header,detail[i:i+2])) for i in range(0,len(detail),2)]
[{'Age': 22, 'Name': 'Joe'}, {'Age': 43, 'Name': 'Dave'}, {'Age': 32, 'Name': 'Herb'}]`
于 2012-10-02T14:24:49.343 に答える