将嵌套列表转换为字典
Convert nested list to dictionary
我试图将其转换为字典的嵌套列表如下所示:
my_dict = {}
book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]
我正在尝试 return 命名 ["Ben"]、["Sally"] 作为键和评级 ["5","0","1","4"] , ["0","7","3","3"] 作为值。
希望输出:
{"Ben": ["5," "0", "1", "4"], "Sally": ["0", "7", "3", "3"]}
如果 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]))
你可以用字典理解来完成它,而不需要定义一个空的字典:
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']}
您可以使用 iter
和一些 zip
魔法来获取所有其他密钥。但是因为你的键在列表中,你只想要它们的单个值,你需要使用字典理解:
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']}
也许是这样的:
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]}
简单的字典组合:
>>> it = iter(book_ratings)
>>> {k: next(it) for k, in it}
{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}
采用已接受答案的解决方案(f1
和 f2
)和我的解决方案(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()
我试图将其转换为字典的嵌套列表如下所示:
my_dict = {}
book_ratings = [["Ben"],["5", "0", "1", "4"], ["Sally"],["0", "7", "3", "3"]]
我正在尝试 return 命名 ["Ben"]、["Sally"] 作为键和评级 ["5","0","1","4"] , ["0","7","3","3"] 作为值。
希望输出:
{"Ben": ["5," "0", "1", "4"], "Sally": ["0", "7", "3", "3"]}
如果 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]))
你可以用字典理解来完成它,而不需要定义一个空的字典:
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']}
您可以使用 iter
和一些 zip
魔法来获取所有其他密钥。但是因为你的键在列表中,你只想要它们的单个值,你需要使用字典理解:
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']}
也许是这样的:
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]}
简单的字典组合:
>>> it = iter(book_ratings)
>>> {k: next(it) for k, in it}
{'Ben': ['5', '0', '1', '4'], 'Sally': ['0', '7', '3', '3']}
采用已接受答案的解决方案(f1
和 f2
)和我的解决方案(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()