迭代Python字典中的值列表

时间:2017-03-15 12:13:32

标签: python dictionary

您好我正在寻找迭代Python字典,其中每个键都有一个值列表,我希望创建一个新的列表/字典,我已经分隔每个值[x]或直接用分离的值做东西

这是我所拥有的字典的简化示例:

all_parameters = {"first": ["1a","1b","1c"], "second": ["2a","2b","2c"], "third": ["3a","3b","3c"]}

我希望将这些值分开(通过创建新的字典或列表或直接使用分隔值进行处理)。

grouped_parameters = [{"first": "1a", "second": "2a", "third": "3a"},
                      {"first": "1b", "second": "2b", "third": "3b"},
                      {"first": "1c", "second": "2c", "third": "3c"}]

我确保如何在每个键上正确迭代:值对。

i = 0
for k, v in all_parameters.items():
    for item in v:
        # stuck here
    i+=1

最终我要做的'东西'是将每个输出(例如'{“first”:“1a”,“second”:“2a”,“third”:“3a”}')转换为字符串这样我就可以将每个参数组发布到表格中的单元格中,所以理想情况下我更愿意动态地执行此操作,而不是创建新的字典。

非常感谢任何帮助。

4 个答案:

答案 0 :(得分:2)

假设所有列表都具有相同的长度:

.img-slider-ul {
  list-style: none;
  margin: 0;
  padding: 0;
  height:350px;
  overflow:hidden;
  position:relative;
  z-index: 0;
}

在Python 3中,使用>>> length = len(next(all_parameters.itervalues())) >>> [{k:v[i] for k,v in all_parameters.iteritems()} for i in range(length)] [{'second': '2a', 'third': '3a', 'first': '1a'}, {'second': '2b', 'third': '3b', 'first': '1b'}, {'second': '2c', 'third': '3c', 'first': '1c'}] len(next(iter(all_parameters.values())))代替items

(完成迭代器的恶作剧,因为如果你只想要任意值列表的长度,你不需要所有字典值的列表。)

答案 1 :(得分:1)

普通字典中的项目没有排序*,因此如果您希望字段按特定顺序转换,则需要小心将字典转换为字符串。

此代码使用一个元组,其中包含我们希望它们在输出dict字符串中的顺序的键字符串。

Group By

<强>输出

all_parameters = {
    "first": ["1a","1b","1c"], 
    "second": ["2a","2b","2c"], 
    "third": ["3a","3b","3c"],
}

# We want keys to be in this order
all_keys = ("first", "second", "third")

# Assumes all value lists are the same length.
for t in zip(*(all_parameters[k] for k in all_keys)):
    a = ['"{}": "{}"'.format(u, v) for u, v in zip(all_keys, t)]
    print('{' + ', '.join(a) + '}')

如何运作

我们首先使用生成器表达式{"first": "1a", "second": "2a", "third": "3a"} {"first": "1b", "second": "2b", "third": "3b"} {"first": "1c", "second": "2c", "third": "3c"} ,它按照(all_parameters[k] for k in all_keys)指定的顺序从all_parameters生成值列表。我们使用all_keys&#34; splat&#34;将这些列表作为参数传递给zip。运营商。因此,对于您的示例数据,它等同于调用*,如下所示:

zip

zip(["1a","1b","1c"], ["2a","2b","2c"], ["3a","3b","3c"]) 有效地转换了传递它的迭代,因此该调用的结果是产生这些元组的迭代器:

zip

然后我们使用('1a', '2a', '3a'), ('1b', '2b', '3b'), ('1c', '2c', '3c') 逐个循环遍历这些元组,因此在第一个循环for t in zip(...)上获取值t,然后('1a', '2a', '3a')等。< / p>

接下来,我们有一个列表解析,用相应的键字符串将值字符串拉上来,并将它们格式化为一个字符串,每个键和值字符串都带有双引号。然后我们将这些字符串与逗号和空格连接起来作为分隔符(并添加括号字符)以生成最终的字典串。

*实际上在Python 3.6中,明确的dicts 保留了插入顺序,但这是一个实现细节,不应该依赖它。

答案 2 :(得分:1)

如果列表的长度不同,您可以map使用None,如下所示:

all_parameters = {"first": ["1a", "1b", "1c", "1d"], "second": ["2a", "2b", "2c"], "third": ["3a", "3b", "3c"]}

final = [dict(zip(all_parameters.keys(), values)) for values in map(None, *all_parameters.values())]

print final

map(None, *all_parameters.values())为您提供每个索引处每个键值的元组 - 例如('1a', '2a', '3a'),通过将其压缩到键并创建字典,我们得到了所需的组合。

注意:这只能在Python 2.x中使用,因为map在3.x中已更改。对于Python 3.x,我们可以使用itertools.zip_longest

from itertools import zip_longest

all_parameters = {"first": ["1a", "1b", "1c", "1d"], "second": ["2a", "2b", "2c"], "third": ["3a", "3b", "3c"]}

final = [dict(zip(all_parameters.keys(), values)) for values in zip_longest(*all_parameters.values())]

print(final)

在这两种情况下,我们得到:

[{'second': '2a', 'third': '3a', 'first': '1a'}, {'second': '2b', 'third': '3b', 'first': '1b'}, {'second': '2c', 'third': '3c', 'first': '1c'}, {'second': None, 'third': None, 'first': '1d'}]

答案 3 :(得分:0)

我不确定这是否是你想要的但是

for i in range(len(all_parameters['first'])):
     for position in all_parameters:
         print(position+" "+all_parameters[position][i])

给出这样的输出

  

第1a条   第二个2a   第三个3a   第1b节   第二个2b   第三个3b   第一个1c   第二个2c   第三个3c

仅当每个字典元素的列表与第一个字典元素的大小相同时,才会起作用。