我有一个数据元组列表:
data = [('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV, Radio, Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
我想复制并使我的数据列表更简单:
data = [('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV'),
('2013/03/07', 'Electronic', 'Radio'),
('2013/03/07', 'Electronic', 'Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
请帮我这样做。
答案 0 :(得分:4)
利用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(链(*(产品(* imap(str.split(','),e)) refine_data))),我使用这一行来展平我的代码,但它显示 这个错误:“*之后的类型对象参数必须是序列,而不是 发生器“,简单的拆分打破了所有的话,甚至空间和 任何特殊的角色,请帮帮我
选项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)))
答案 1 :(得分:1)
因为第3个元素是逗号分隔的字符串,所以你可以检查它是否存在并相应地拆分
In [131]: data
Out[131]:
[('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV, Radio, Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
In [132]: data2 = []
In [133]: for item in data:
.....: if item[2].find(',') > -1:
.....: x = [(item[0], item[1], x.strip()) for x in item[2].split(',')]
.....: for i in x:
.....: data2.append(i)
.....: else:
.....: data2.append(item)
.....:
In [134]: data2
Out[134]:
[('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV'),
('2013/03/07', 'Electronic', 'Radio'),
('2013/03/07', 'Electronic', 'Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
答案 2 :(得分:0)
此代码可以帮助您简化数据。
data = [('Date', 'Type', 'Product'), ('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), ('2013/03/07', 'leather', 'Gucci Wallet')]
for tup in data:
items=tup[2].split(',');
if len(items)>1:
date=tup[0];
typ=tup[1];
data.remove(tup);
for i in items:
data.append(tuple([date,typ,i]));
PS :这可能无法维持原始订单。
答案 3 :(得分:0)
我认为这样做的方法是
def mycopy(lst):
newlst = []
for tup in lst:
newitems = tup[-1].split(',')
rest = tup[:-1]
for i in newitems:
newlst.append(rest+(i,))
return newlst
这保留了订单,但是在新列表(未到位)上运行。 如果需要,我会写一个。
答案 4 :(得分:0)
所以我认为我有更多pythonic解决这个问题,我的代码是:
result_lst = []
for tup in data[1:]:
result_lst+=[tup[0:2] + tuple([product]) for product in tup[2].split(',')]
print result
OUT:
[('2013/03/07', 'Electronic', 'TV'),
('2013/03/07', 'Electronic', ' Radio'),
('2013/03/07', 'Electronic', ' Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]
答案 5 :(得分:0)
result = data[:1]
for item in data[1:]:
(date, category, products) = item
result.extend(map(lambda product: (date, category, product), tuple(products.split(', '))))
print result
这就像我一样pythonic ......
输出:
[('Date', 'Type', 'Product'),
('2013/03/07', 'Electronic', 'TV'),
('2013/03/07', 'Electronic', 'Radio'),
('2013/03/07', 'Electronic', 'Microwave'),
('2013/03/07', 'leather', 'Gucci Wallet')]