创建以动态数量的值作为参数的字典
Creating dictionary with dynamic number of values as arguments
我 运行 在尝试让脚本作为函数运行时遇到了一些麻烦。
下面的代码基本上压缩了多个值列表。所以我可以继续添加 list4
、list5
等
list1 = ['USA', 'France', 'China']
list2 = [30, 39, 28]
list3 = [59.2, 93.1, 922.1]
dictionary = {}
for i in range(len(list1)):
d[list1[i]] = list2[i], list3[i]
print(dictionary)
我正在寻找类似这样的输出:
{'USA': (30, 59.2), 'France': (39, 93.1), 'China': (28, 922.1)}
现在我想把它变成一个函数,比如:
def zipMultiple(*values, keys):
dictionary = {}
for i in range(len(keys)):
dictionary[keys[i]] = values[i]
return dictionary
myDict = zipMultiple(list2, list3, keys=list1)
我收到这个错误:
dictionary[keys[i]] = values[i] IndexError: tuple index out of range
我知道这可能是因为分配 values[i]
就好像它是一个列表,但我不知道如何将它概括为“为每个 values
创建一个元组” (列表)作为参数给出。
您需要执行 a transpose operation 以便键与值适当对齐:
def zipMultiple(*values, keys):
dictionary = {}
values = list(map(tuple, zip(*values)))
for i in range(len(keys)):
dictionary[keys[i]] = values[i]
return dictionary
或者,您可以将其设为 one-liner(Joffan 建议改进):
def zipMultiple(*values, keys):
return dict(zip(keys, zip(*values)))
在这两种情况下,输出都是:
{'USA': (30, 59.2), 'France': (39, 93.1), 'China': (28, 922.1)}
解释:
如果您打印出函数内部的 values
(如最初传入的那样),您将看到:
([30, 39, 28], [59.2, 93.1, 922.1])
第一个列表包含每个键的第一个元素,第二个列表包含每个键的第二个元素,依此类推。
但是,这不是我们想要的。我们希望第一个元素包含第一个键的所有元素,第二个元素包含第二个键的所有元素,等等;我们正在寻找类似以下内容:
[
(30, 59.2),
(39, 93.1),
(28, 922.1)
]
以便键以与值相同的方式排列。为此,我们执行上面显示的转置操作。
我 运行 在尝试让脚本作为函数运行时遇到了一些麻烦。
下面的代码基本上压缩了多个值列表。所以我可以继续添加 list4
、list5
等
list1 = ['USA', 'France', 'China']
list2 = [30, 39, 28]
list3 = [59.2, 93.1, 922.1]
dictionary = {}
for i in range(len(list1)):
d[list1[i]] = list2[i], list3[i]
print(dictionary)
我正在寻找类似这样的输出:
{'USA': (30, 59.2), 'France': (39, 93.1), 'China': (28, 922.1)}
现在我想把它变成一个函数,比如:
def zipMultiple(*values, keys):
dictionary = {}
for i in range(len(keys)):
dictionary[keys[i]] = values[i]
return dictionary
myDict = zipMultiple(list2, list3, keys=list1)
我收到这个错误:
dictionary[keys[i]] = values[i] IndexError: tuple index out of range
我知道这可能是因为分配 values[i]
就好像它是一个列表,但我不知道如何将它概括为“为每个 values
创建一个元组” (列表)作为参数给出。
您需要执行 a transpose operation 以便键与值适当对齐:
def zipMultiple(*values, keys):
dictionary = {}
values = list(map(tuple, zip(*values)))
for i in range(len(keys)):
dictionary[keys[i]] = values[i]
return dictionary
或者,您可以将其设为 one-liner(Joffan 建议改进):
def zipMultiple(*values, keys):
return dict(zip(keys, zip(*values)))
在这两种情况下,输出都是:
{'USA': (30, 59.2), 'France': (39, 93.1), 'China': (28, 922.1)}
解释:
如果您打印出函数内部的 values
(如最初传入的那样),您将看到:
([30, 39, 28], [59.2, 93.1, 922.1])
第一个列表包含每个键的第一个元素,第二个列表包含每个键的第二个元素,依此类推。
但是,这不是我们想要的。我们希望第一个元素包含第一个键的所有元素,第二个元素包含第二个键的所有元素,等等;我们正在寻找类似以下内容:
[
(30, 59.2),
(39, 93.1),
(28, 922.1)
]
以便键以与值相同的方式排列。为此,我们执行上面显示的转置操作。