[英]Zipping two arrays of n and 2n length to form a dictionary
我正在努力解決這個小問題。 假設:
field_name = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']
輸出類似於:
{ 'name': ['john','jane'],
'age': ['24', '26'],
'sex': ['M', 'F']
}
現在壓縮:
dict_sample_fields = dict(zip(field_name, field_value))
#output
{ 'name': 'john',
'age': '24',
'sex': 'M'
}
如何實現對值的循環壓縮?
我可以通過多循環實現這么長的路。 單線會很酷:D。
非常簡單,你甚至不需要zip
:
{k: field_values[i::len(field_name)] for i, k in enumerate(field_name)}
# {'name': ['john', 'jane'], 'age': ['24', '26'], 'sex': ['M', 'F']}
使用切片list
中的步驟,並從field_name
的索引開始。
假設您的值以3個索引的距離分隔,您可以執行類似的操作而不使用單個for循環的任何zip
。 使用enumerate
可以訪問索引,您可以使用該索引來訪問列表值。 如果您想使它更通用,您可以使用字段數('鍵')作為偏移量。
dict_sample_fields = {}
offset = len(field_name)
for i, key in enumerate(field_name):
dict_sample_fields[key] = [field_values[i], field_values[i+offset]]
產量
{'name': ['john', 'jane'], 'age': ['24', '26'], 'sex': ['M', 'F']}
把它們放在一起
dict_sample_fields = {key: [field_values[i], field_values[i+3]] for i, key in enumerate(field_name)}
我們可以將與值grouper
從功能more_itertools
或與同名配方在itertools
文檔。 然后可以用zip
轉換這些組。
>>> from more_itertools import grouper
>>>
>>> field_name = ['name', 'age', 'sex']
>>> field_values = ['john', '24', 'M', 'jane', '26', 'F']
>>>
>>> dict(zip(field_name, map(list, zip(*grouper(len(field_name), field_values)))))
{'age': ['24', '26'], 'name': ['john', 'jane'], 'sex': ['M', 'F']}
這不會產生中間列表。
假設您可以控制field_values
的結構(我從您的評論中了解到),您可以退后一步,並將它們重新格式化為嵌套列表。 它會看起來像這樣,對你的任務更好:
field_values = [['john', '24', 'M'], ['jane', '26', 'F']]
現在它只是一條可讀的行:
dict_sample_fields = dict(zip(field_name, zip(*field_values)))
產生:
{'name': ('john', 'jane'), 'age': ('24', '26'), 'sex': ('M', 'F')}
能夠解決任何問題,你的方式絕對是一個非常重要的資產,但確保你沒有很多問題,甚至更好。
您可以多次使用zip :
field_name = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']
values = list(zip(*zip(field_values[::3],field_values[1::3], field_values[2::3])) )
result = { key : list(value) for key, value in zip(field_name, values)}
print(result)
產量
{'sex': ['M', 'F'], 'name': ['john', 'jane'], 'age': ['24', '26']}
或者在一行中:
result = { key : list(value) for key, value in zip(field_name, zip(*zip(field_values[::3], field_values[1::3], field_values[2::3])))}
這是一個很長的路要走。 你可以用這個寫一個單行,但會讓它變得難以理解。 輸出不同,但可能有助於您的問題。 希望能幫助到你
field_names = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']
breaking_number = len(field_names)
master_dict = {}
# break list into equal parts size of field_names
chunks = [field_values[x:x+breaking_number] for x in range(0, len(field_values), breaking_number)]
for chunk in chunks:
# zip this chunk with field_name and make one dict
master_dict.update(list(zip(field_names, chunk)))
print(master_dict)
輸出:
{'name': 'john', 'age': '24', 'sex': 'M'}
{'name': 'jane', 'age': '26', 'sex': 'F'}
這是使用嵌套zip()
的一個答案:
field_name = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']
n = len(field_name)
result = dict(zip(field_name, map(list, zip(field_values[:n], field_values[n:]))))
print(result)
# {'name': ['john', 'jane'], 'age': ['24', '26'], 'sex': ['M', 'F']}
這是做到這一點的方式。
field_name = ['name', 'age', 'sex']
field_values = ['john', '24', 'M', 'jane', '26', 'F']
dict_vals = {}
for idx, filed in enumerate(field_name):
dict_vals[filed] = field_values[idx::len(field_name)]
print(dict_vals)
// {'age': ['24', '26'], 'name': ['john', 'jane'], 'sex': ['M', 'F']}
PS:只是為了幫助你理解這句話field_values[idx::len(field_name)]
L[start_index::step_number]
表示L的片,其中start_index
是從其開始的索引, step_number
告訴解釋器需要跳過多少個值索引。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.