直接获取dict键的产品及其值的方法

时间:2014-04-16 12:34:13

标签: python dictionary list-comprehension product itertools

我有这个字典用于分组文件名和扩展名:

email_fields = {'txt': ('subject', 'plaintext_body'),
                'html': ('html_body',)}

我需要得到一个像这样的元组列表:

>>> get_my_list(email_fields)
[('txt', 'subject'), ('txt', 'plaintext_body'), ('html', 'html_body')]

我想使用starmap模块中的productchainitertools来执行此操作:

foo = starmap(product, email_fields.items())
chain.from_iterable(foo)

我遇到的问题是product需要两次迭代,而email_fields的键是字符串,我得到这样的结果:

[('t', 'subject'),
 ('t', 'plaintext_body'),
 ('x', 'subject'),
 ('x', 'plaintext_body'),
 ('t', 'subject'),
 ('t', 'plaintext_body')],
 ('h', 'html_body'),
 ('t', 'html_body'),
 ('m', 'html_body'),
 ('l', 'html_body')]

有更好的方法吗?我得到的最接近的作品,但看起来更丑陋:

foo = [product([ext], field) for ext, field in email_fields.items()]
chain.from_iterable(foo)

2 个答案:

答案 0 :(得分:3)

我会这样做,手动迭代键,然后迭代每个键的值:

[(k, v) for k in email_fields for v in email_fields[k]]

<强>输出:

[('txt', 'subject'), ('txt', 'plaintext_body'), ('html', 'html_body')]

这里不需要itertools。 :)

答案 1 :(得分:1)

你可以在没有product本身的情况下,通过简单地迭代字典,然后是每个值,就像这样

print [(k, item) for k in email_fields for item in email_fields[k]]
# [('txt', 'subject'), ('txt', 'plaintext_body'), ('html', 'html_body')]