子映射的映射列表

时间:2016-07-05 13:30:16

标签: python list python-3.x dictionary mapping

我有如下的映射

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]

但是,这不会根据#之后的数字对值进行排序。

3 个答案:

答案 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]

注意:

  1. 使用enumerate - for i in range(len(something))被认为是一种坏习惯
  2. Python3中需要将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