簡體   English   中英

將嵌套列表轉換為字典

[英]Convert nested list to dictionary

我試圖轉換為字典的嵌套列表如下所示:

my_dict = {}
book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]

我試圖返回名稱 ["Ben"], ["Sally"] 作為鍵和評級 ["5","0","1","4"], ["0","7" ,"3","3"] 作為值。

希望輸出:

 {"Ben": ["5," "0", "1", "4"], "Sally": ["0", "7", "3", "3"]}

簡單的字典組合:

>>> it = iter(book_ratings)
>>> {k: next(it) for k, in it}
{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}

使用已接受答案的解決方案( f1f2 )和我的( f3 )進行基准測試,三輪,數字是以秒為單位的時間,因此更低=更快:

2.31 f1
2.08 f2
1.39 f3

2.30 f1
2.03 f2
1.34 f3

2.30 f1
2.08 f2
1.31 f3

基准代碼:

from timeit import repeat

book_ratings = []
for i in range(1000):
    book_ratings += [["Ben" + str(i)],["5", "0", "1", "4"]]    

def f1():
    i = iter(book_ratings)
    return dict((a[0], b) for a, b in zip(i, i))

def f2():
    return dict((a, b) for (a,), b in zip(book_ratings[::2], book_ratings[1::2]))

def f3():
    it = iter(book_ratings)
    return {k: next(it) for k, in it}

for _ in range(3):
    for f in f1, f2, f3:
        t = min(repeat(f, number=10000))
        print('%.2f' % t, f.__name__)
    print()

如果book_ratings的結構是 Name, List, Name, List, ... 你可以用這個例子來構造字典:

book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]

i = iter(book_ratings)
my_dict = dict((a[0], b) for a, b in zip(i, i))

print(my_dict)

印刷:

{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}

或者:

my_dict = dict((a, b) for (a,), b in zip(book_ratings[::2], book_ratings[1::2]))

您可以使用iter和一些zip魔法來獲取其他所有密鑰。 但是由於您的鍵在列表中並且您只想要它們的單個值,因此您需要使用 dict 理解:

book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]
my_dict = {k[0]: v for k, v in zip(*([iter(book_ratings)]*2))}

{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}

您可以使用 dict 推導來實現,而無需定義一個空的 dict:

book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]
new_dict = {book_ratings[i][0]:book_ratings[i+1] for i in range(0,len(book_ratings),2)}
new_dict

輸出:

{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}

也許是這樣的:

my_dict = {}
book_ratings = [['Ben'],['5', '0', '1', '4'], ['Sally'],['0', '7', '3', '3']]

i=0
while i<len(book_ratings):
  if not book_ratings[i][0].isnumeric():
    my_dict[book_ratings[i][0]] = book_ratings[i+1]
    i+=2
  else:
    i+=1

print(my_dict)

輸出:

{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}

另一種解決方案,對於初學者來說可能更簡單

my_dict =  {}
book_ratings = [['Ben'],[5, 0, 1, 4], ['Sally'],[0, 7, 3, 3]]
for i, book in enumerate(book_ratings):
    if (i==0) or (i%2==0):
        try:
            my_dict[book[0]] = book_ratings[i+1]
        except:
            pass
        
print(my_dict)

印刷

  {'Ben': [5, 0, 1, 4], 'Sally': [0, 7, 3, 3]}
    

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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