簡體   English   中英

壓縮兩個n和2n長度的數組以形成字典

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM