您好我正在寻找迭代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”}')转换为字符串这样我就可以将每个参数组发布到表格中的单元格中,所以理想情况下我更愿意动态地执行此操作,而不是创建新的字典。
非常感谢任何帮助。
答案 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
仅当每个字典元素的列表与第一个字典元素的大小相同时,才会起作用。