Python:如何以编程方式创建数组字典

Python:如何以编程方式创建数组字典,python,arrays,dictionary,Python,Arrays,Dictionary,我有一个数组a,我希望在以编程方式创建键的同时,每5个值存储一个字典 例如: 如果我们有 a=[1,2,3,4,5,6,7,8,9,10] 我希望字典看起来像这样: d={"first_title":[1,2,3,4,5], "second_title":[6,7,8,9,10]} # Input a = range(22) keys = [1984, 1985, 1986] # maybe replace it with range(1984, 2000) n = 5 # Code b

我有一个数组
a
,我希望在以编程方式创建键的同时,每5个值存储一个字典

例如:

如果我们有

a=[1,2,3,4,5,6,7,8,9,10]
我希望字典看起来像这样:

d={"first_title":[1,2,3,4,5], "second_title":[6,7,8,9,10]}
# Input
a = range(22)
keys = [1984, 1985, 1986] # maybe replace it with range(1984, 2000)
n = 5

# Code
b = a
my_dict = {}

for i in range(min(len(keys), len(a)//n)):
    key = keys[min(i, len(keys)-1)]
    my_dict[key] = b[:n]
    b = b[n:]

my_dict['later'] = b

print(my_dict)

# Output
{
    1984: [0, 1, 2, 3, 4], 
    1985: [5, 6, 7, 8, 9], 
    1986: [10, 11, 12, 13, 14], 
    'later': [15, 16, 17, 18, 19, 20, 21]
}

编辑:我有数千个术语,所以我想在循环中执行此操作

字典值可以是任何对象,包括数组。因此,您只需从一个空dict开始,并向其中添加数组值

my_dict = {}
year = 1984
for index in range(0, len(a), 5):
    my_dict[year] = a[index: index+5]
    year += 1

下面是一个比较通用的python解决方案:

from itertools import izip_longest


def grouper(n, iterable, fillvalue=None):
    """grouper(3, 'ABCDEFG', 'x') --> ABC DEF Gxx"""
    args = [iter(iterable)] * n
    return izip_longest(fillvalue=fillvalue, *args)

keys = ["first-title", "second-title"]
a = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

result = {key: list(group) for key, group in zip(keys, grouper(5, a))}
这使用了石斑鱼的配方(请参阅此以获得更好的解释)。一个不太像Python的解决方案是使用for循环迭代密钥和组对:

result = {}
for key, group in zip(keys, grouper(5, a)):
    result[key] = group
在这两种情况下,输出为:

{'first-title': [1, 2, 3, 4, 5], 'second-title': [6, 7, 8, 9, 10]}
这个怎么样

输入:

a = [1,2,3,4,5,6,7,8,9,10]
keys = [1984, 1985, 1986, 1987] 
n = 5
my_dict = {}

for i in range(len(a)//n):
    key = str(keys[i]) if i < len(keys) else "after " + str(keys[-1])
    my_dict[key] = a[i*n: (i+1)*n]

print(my_dict)
{'1984': [1, 2, 3, 4, 5], '1985': [6, 7, 8, 9, 10]}
代码:

a = [1,2,3,4,5,6,7,8,9,10]
keys = [1984, 1985, 1986, 1987] 
n = 5
my_dict = {}

for i in range(len(a)//n):
    key = str(keys[i]) if i < len(keys) else "after " + str(keys[-1])
    my_dict[key] = a[i*n: (i+1)*n]

print(my_dict)
{'1984': [1, 2, 3, 4, 5], '1985': [6, 7, 8, 9, 10]}

根据您的用例,您还可以执行以下操作:

d={"first_title":[1,2,3,4,5], "second_title":[6,7,8,9,10]}
# Input
a = range(22)
keys = [1984, 1985, 1986] # maybe replace it with range(1984, 2000)
n = 5

# Code
b = a
my_dict = {}

for i in range(min(len(keys), len(a)//n)):
    key = keys[min(i, len(keys)-1)]
    my_dict[key] = b[:n]
    b = b[n:]

my_dict['later'] = b

print(my_dict)

# Output
{
    1984: [0, 1, 2, 3, 4], 
    1985: [5, 6, 7, 8, 9], 
    1986: [10, 11, 12, 13, 14], 
    'later': [15, 16, 17, 18, 19, 20, 21]
}

如何设想“以编程方式创建键”a是一个列表,而不是一个数组。在许多其他问题和其他帮助站点中,都会处理切片成常规块的问题。你在这一部分的什么地方卡住了?你例子中的
d
不是字典,它使用了非法的符号。我有数千个术语,所以我想以某种循环的方式来做这件事。我希望密钥是一年。例如1984年、1985年等。如果您希望密钥为年,为什么不在问题中这样说?@您的答案的当前修订版:您在错误的假设下编写了它,即数组包含条目[1,2,…n],因此您将其替换为
范围(n)
。op说他有一个[arbitary]数组,所以我们可以假设这些数字只是一个例子…@FabianN.:Edited稍微偏离主题,但是:+1对于使用dict理解,我甚至不知道这是可能的。