表示使用 python 中的理解创建列表和字典
Representing a creation of list and dictionary using comprehensions in python
我有一些关于我写的程序的问题。我的数据如下
data = ['Sectors', 'Countries', 'Regions', 6, 9, 4, 2, 3, 0]
columns = {'countries': 'Countries', 'regions': 'Regions', 'sectors': 'Sectors'}
column_size = 3
要根据提供的列数转换成特定的字典,我使用策略写了2个函数。第一个函数是转换为二维列表,其中二维列表的第一项提供列名,而其他项表示值。第二个函数通过根据它所在的位置映射键和值来给出预期的输出
Output: {'Sectors': [6, 2], 'Countries': [9, 3], 'Regions': [4, 0]}
以下是我的代码
def converting_to_two_dimensional_list(data: list, column_size: int):
list_two_dimensional = []
for l in range(0, len(data), column_size):
buffer = []
for j in range(l, l+column_size):
buffer.append(data[j])
list_two_dimensional.append(buffer)
return list_two_dimensional
def final_result(list_two_dimensional: list):
final_output = {}
for c in list_two_dimensional[0]:
buffer = []
for d in range(len(list_two_dimensional[1:])):
buffer.append(list_two_dimensional[1:][d][list_two_dimensional[0].index(c)])
final_output.update({c:buffer})
return final_output
if __name__ == '__main__':
result = final_result(converting_to_two_dimensional_list(data, column_size))
print(result)
虽然我得到了预期的输出,但有没有什么方法可以使用理解来表示这些函数,如果没有,那么有没有优化的方法来获得相同的输出?
谢谢
你可以使用列表理解
data = ['Sectors', 'Countries', 'Regions', 6, 9, 4, 2, 3, 0]
column_size = 3
d = data[column_size:]
output = dict(zip(data[0:column_size], [[d[j] for j in range(i, len(d), column_size)] for i in range(column_size)]))
print(output) #{'Sectors': [6, 2], 'Countries': [9, 3], 'Regions': [4, 0]}
您可以使用一些选项来使它更加 pythonic,是的。虽然制作一个获得所需输出的 pythonic 版本很容易,但我不确定您要解决的一般问题是什么,因此将在下面为不同的选项提供一些示例函数。
我能想到的第一个选项是每个键都有固定数量的元素,您可以通过以下方式实现:
def format_data(data, num_keys, num_values = 2):
# Use slicing to get the two halves of the list
keys, values = data[:num_keys], data[num_keys:]
# Use enumerate and num_values to iterate over the keys and get the values
return {key: values[num_values * i : num_values * (i + 1)] for i, key in enumerate(keys)}
我能想到的第二个选项与第一个选项类似,但是您希望在键之间平均分配值,因此如果您有 2 个键和 8 个值,每个将得到 4 个值:
def format_data(data, num_keys):
# Use slicing to get the two halves of the list
keys, values = data[:num_keys], data[num_keys:]
# Use integer division get the number of values for each key
num_values = values // num_keys
# Use enumerate and num_values to iterate over the keys and get the values
return {key: values[num_values * i : num_values * (i + 1)] for i, key in enumerate(keys)}
我有一些关于我写的程序的问题。我的数据如下
data = ['Sectors', 'Countries', 'Regions', 6, 9, 4, 2, 3, 0]
columns = {'countries': 'Countries', 'regions': 'Regions', 'sectors': 'Sectors'}
column_size = 3
要根据提供的列数转换成特定的字典,我使用策略写了2个函数。第一个函数是转换为二维列表,其中二维列表的第一项提供列名,而其他项表示值。第二个函数通过根据它所在的位置映射键和值来给出预期的输出
Output: {'Sectors': [6, 2], 'Countries': [9, 3], 'Regions': [4, 0]}
以下是我的代码
def converting_to_two_dimensional_list(data: list, column_size: int):
list_two_dimensional = []
for l in range(0, len(data), column_size):
buffer = []
for j in range(l, l+column_size):
buffer.append(data[j])
list_two_dimensional.append(buffer)
return list_two_dimensional
def final_result(list_two_dimensional: list):
final_output = {}
for c in list_two_dimensional[0]:
buffer = []
for d in range(len(list_two_dimensional[1:])):
buffer.append(list_two_dimensional[1:][d][list_two_dimensional[0].index(c)])
final_output.update({c:buffer})
return final_output
if __name__ == '__main__':
result = final_result(converting_to_two_dimensional_list(data, column_size))
print(result)
虽然我得到了预期的输出,但有没有什么方法可以使用理解来表示这些函数,如果没有,那么有没有优化的方法来获得相同的输出?
谢谢
你可以使用列表理解
data = ['Sectors', 'Countries', 'Regions', 6, 9, 4, 2, 3, 0]
column_size = 3
d = data[column_size:]
output = dict(zip(data[0:column_size], [[d[j] for j in range(i, len(d), column_size)] for i in range(column_size)]))
print(output) #{'Sectors': [6, 2], 'Countries': [9, 3], 'Regions': [4, 0]}
您可以使用一些选项来使它更加 pythonic,是的。虽然制作一个获得所需输出的 pythonic 版本很容易,但我不确定您要解决的一般问题是什么,因此将在下面为不同的选项提供一些示例函数。
我能想到的第一个选项是每个键都有固定数量的元素,您可以通过以下方式实现:
def format_data(data, num_keys, num_values = 2):
# Use slicing to get the two halves of the list
keys, values = data[:num_keys], data[num_keys:]
# Use enumerate and num_values to iterate over the keys and get the values
return {key: values[num_values * i : num_values * (i + 1)] for i, key in enumerate(keys)}
我能想到的第二个选项与第一个选项类似,但是您希望在键之间平均分配值,因此如果您有 2 个键和 8 个值,每个将得到 4 个值:
def format_data(data, num_keys):
# Use slicing to get the two halves of the list
keys, values = data[:num_keys], data[num_keys:]
# Use integer division get the number of values for each key
num_values = values // num_keys
# Use enumerate and num_values to iterate over the keys and get the values
return {key: values[num_values * i : num_values * (i + 1)] for i, key in enumerate(keys)}