表示使用 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)}