我有如下的映射
mapping = [
"key1",
"key2",
"key3",
"key4",
"key5#1",
"key5#4",
"key5#2",
"key5#3",
"key6#1",
"key6#2"
]
和列表,例如[['val1', 'val2', 'val3', 'val4', 'val5', 'val6', 'val7', 'val8', 'val9' 'val10']]
我希望最终得到一个词典列表,例如
[{
"key1": "val1",
"key2": "val2",
"key3": "val3",
"key4": "val4",
"key5": ["val5", "val7", "val8", "val6"],
"key6": ["val9", "val10"],
}]
这样,没有#
的每个键只有1个值,而#
的键有一个有序列表,按#
之后的整数排序。我现在拥有的是:
for i in range(len(mapping)):
if '#' in mapping[i]:
result.setdefault(mapping[i].split('#')[0], []).append(row[i])
else:
result[mapping[i]] = row[i]
但是,这不会根据#
之后的数字对值进行排序。
答案 0 :(得分:2)
您可以在此处使用itertools.groupby
。我们的想法是使用映射中的键创建一个字典,最初每个键将被初始化为一个密钥重复次数None
的列表。
from itertools import groupby
dct = {}
for k, g in groupby(mapping, lambda x: x.split('#')[0]):
length = sum(1 for _ in g)
dct[k] = [None] * length
...
现在dct
看起来像:
>>> dct
{'key3': [None],
'key2': [None],
'key1': [None],
'key6': [None, None],
'key5': [None, None, None, None],
'key4': [None]}
请注意,如果映射尚未排序,那么我们可以使用mapping.sort(key=lambda x: x.split('#')[0])
对其进行排序。这会将类似的键组合在一起。
上述事情也可以通过首先识别每个键的计数,然后使用计数初始化dict
来完成。这样就可以在O(N)时间内完成,以防mapping
中的类似键未被分组。
>>> from collections import Counter
>>> dct = {k: [None] * v for k, v in Counter(
key.split('#')[0] for key in mapping).items()}
现在我们可以循环遍历映射和列表并相应更新dct
中的值:
for key, value in zip(mapping, lst[0]):
if '#' not in key:
dct[key] = value
else:
key, index = key.split('#')
# Simply assign the value to the index
dct[key][int(index)-1] = value
...
>>> dct
{'key3': 'val3',
'key2': 'val2',
'key1': 'val1',
'key6': ['val9', 'val10'],
'key5': ['val5', 'val7', 'val8', 'val6'],
'key4': 'val4'}
答案 1 :(得分:0)
这是你要求的吗?
for i, key in enumerate(mapping):
if '#' in key:
key, order = key.split('#')
result.setdefault(key, []).insert(int(order) - 1, row[i])
else:
result[key] = row[i]
注意:
enumerate
- for i in range(len(something))
被认为是一种坏习惯order
强制转换为int
- insert需要一个int,一个字符串将不起作用。答案 2 :(得分:0)
听起来像是<?php
declare(ticks = 1);
$a = [
'https://twitter.com',
'https://facebook.com',
'https://stackoverflow.com',
'https://linkedin.com',
'https://github.com',
];
// Count of php threads (forks or processes).
$max = 3;
// Child counter.
$child = 0;
pcntl_signal(SIGCHLD, function ($signo) {
global $child;
if ($signo === SIGCLD) {
while (($pid = pcntl_wait($signo, WNOHANG)) > 0) {
$signal = pcntl_wexitstatus($signo);
$child--;
}
}
});
foreach ($a as $item) {
while ($child >= $max) {
sleep(1);
}
$child++;
$pid = pcntl_fork();
if ($pid) {
} else {
// Child fork.
sleep(1);
// HERE YOUR CODE:
echo file_get_contents($item);
exit(0);
}
}
while ($child != 0) {
sleep(1);
}
和列表切片的工作。请注意,您在groupby
之后错过了row
中的逗号。
val9