利用 itertools 的好问题。
将解决方案阅读为展平通过使用“,”拆分生成的项目对列表
list(chain(*(product(*imap(str.split, e)) for e in data)))
这是演示
>>> from pprint import PrettyPrinter
>>> pp = PrettyPrinter(indent = 4)
>>> data = [('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV, Radio, Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
>>> from itertools import izip, imap, product, chain
>>> data = list(chain(*(product(*imap(str.split, e)) for e in data)))
>>> pp.pprint(data)
[ ('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV,'),
('2013/03/07', 'Electronic', 'Radio,'),
('2013/03/07', 'Electronic', 'Microwave'),
('2013/03/07', 'leather', 'Gucci'),
('2013/03/07', 'leather', 'Wallet')]
从 OP 更新
data = list(chain(*(product(*imap(str.split(','), e)) for e in refine_data))) ,我用这一行来展平我的代码,但它显示了这个错误:“type object * 之后的参数必须是序列,而不是生成器”,简单的拆分会破坏所有单词,即使有空格和任何特殊字符,请帮帮我
选项1:
>>> from operator import methodcaller
>>> list(chain(*(product(*imap(methodcaller("split", ","), e)) for e in data)))
选项 2:
>>> list(chain(*(product(*(s.split(",") for s in e)) for e in data)))