[英]how to convert two-dimensional list to another list with dict as elements
如何將list1轉換為list2?
list1 =[[1, 11], [2, 22], [3, 33], [4, 44]]
list2 = [[{1:2},{11:22}],[{3:4},{33:44}]]
列表2的鍵是列表1的奇數元素,而列表2的值是列表1的偶數
我已經嘗試過如下,但得到不同的list3。
def f(list1):
newlist=[]
for i in range(0, len(list1), 2):
dict1={}
for j,key in enumerate (list1[i]):
dict1[key]=list1[i+1][j]
newlist.append(dict1)
print newlist
f(list1)
[{1: 2, 11: 22}, {1: 2, 11: 22}, {33: 44, 3: 4}, {33: 44, 3: 4}]
作為列表理解:
list1 = [[1, 11], [2, 22], [3, 33], [4, 44]]
list2 = [[{tup[0]: tup[1]} for tup in zip(*list1[i:i+2])] for i in range(0, len(list1), 2)]
# Prints as [[{1: 2}, {11: 22}], [{3: 4}, {33: 44}]]
編輯:這是一個更清潔(也許更多的Pythonic的)。
list2 = [[dict([tup]) for tup in zip(*sublist)] for sublist in zip(list1[0::2], list1[1::2])]
編輯2:列表理解等效於此嵌套的for循環。
list1 =[[1, 11], [2, 22], [3, 33], [4, 44]]
list2 = list()
# Iterate over list1 two by two, first round: sublist = ([1,11], [2,22])
for sublist in zip(list1[0::2], list1[1::2]):
inner_result = list()
# Second loop equivalent to for tup in zip(sublist[0], sublist[1])
for tup in zip(*sublist): # First round, tup will be (1,2) then (11, 22)
# Make dictionary from tuple, for first tuple this is
# equivalent to: dict([(1,2)]) == {1: 2}
new_dict = dict([tup])
inner_result.append(new_dict)
list2.append(inner_result)
您的代碼幾乎是正確的。 問題在這里:
dict1={}
for j,key in enumerate (list1[i]):
dict1[key]=list1[i+1][j]
newlist.append(dict1)
在循環中,您使用的是相同的字典。 因此,要實現所需的功能,只需將dict1
定義移入循環(在每次迭代中創建一個新的dict):
for j,key in enumerate (list1[i]):
dict1={}
dict1[key]=list1[i+1][j]
newlist.append(dict1)
這是您要找的東西嗎?
list2 = []
ind = 0
while ind < len(list1):
d1 = {list1[ind][0]: list1[ind+1][0]}
d2 = {list1[ind][1]: list1[ind+1][1]}
list2.append([d1, d2])
ind += 2
print list2 # prints [[{1: 2}, {11: 22}], [{3: 4}, {33: 44}]]
從給定列表創建列表->列表->字典 ,認為第一個項目是list1的鍵,第一個項目是值。
list1
的每個項目,因為我們想要list1
中每個項目的索引。 list1
result
列表中。 演示:
>>> list1 =[[1, 11], [2, 22], [3, 33], [4, 44]]
>>> for i, value in enumerate(list1):
... if i%2==0:
... try:
... result.append([{value[0]:list1[i+1][0]}, {value[1]:list1[i+1][1]}])
... except IndexError:
... print "Index Over"
... break
...
>>> result
[[{1: 2}, {11: 22}], [{3: 4}, {33: 44}]]
這是你想要的?
def f(lista):
lnew = []
i=0
while i < len(lista):
dict1 = {lista[i][0]:lista[i+1][0]}
dict2 = {lista[i][1]:lista[i+1][1]}
lnew.append([dict1,dict2])
i += 2
return lnew
lold = [[1, 11], [2, 22], [3, 33], [4, 44]]
print(f(lold))
In [27]: list1 =[[1, 11], [2, 22], [3, 33], [4, 44]]
In [28]: l2 = [ zip(item, list1[k+1]) for k,item in enumerate(list1) if k +1 < len(list1) and k % 2 == 0 ]
In [29]: [[{ item[0][0]: item[1][0]}, [{item[0][1]: item[1][1] }] ] for item in l2]
Out[29]: [[{1: 11}, [{2: 22}]], [{3: 33}, [{4: 44}]]]
newlist=[]
for i in range(0, len(list1), 2):
dict1={}
for j,key in enumerate (list1[i]):
dict1[key]=list1[i+1][j]
newlist.append([dict1])
print newlist
更新我的編碼,從2nd下的newlist.append(dict1)更改為1st下的newnlist.append([dict1])
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.