我有这个字典用于分组文件名和扩展名:
email_fields = {'txt': ('subject', 'plaintext_body'),
'html': ('html_body',)}
我需要得到一个像这样的元组列表:
>>> get_my_list(email_fields)
[('txt', 'subject'), ('txt', 'plaintext_body'), ('html', 'html_body')]
我想使用starmap
模块中的product
,chain
和itertools
来执行此操作:
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)
答案 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')]