簡體   English   中英

如何將二維列表轉換為以dict為元素的另一個列表

[英]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的鍵,第一個項目是值。

  1. 通過枚舉器迭代list1的每個項目,因為我們想要list1中每個項目的索引。
  2. 僅處理索引為偶數表示0、2、4,..的那些項。
  3. 列表的當前項和下一項創建字典的列表 list1
  4. 將字典的列表追加到result列表中。
  5. 處理索引錯誤的異常

演示:

>>> 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.

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