Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用python展平元组中的项列表?_Python_List_Tuples - Fatal编程技术网

如何使用python展平元组中的项列表?

如何使用python展平元组中的项列表?,python,list,tuples,Python,List,Tuples,我有一个数据元组列表: data = [('Date', 'Type', 'Product'), ('2013/03/07', 'Electronic', 'TV, Radio, Microwave'), ('2013/03/07', 'leather', 'Gucci Wallet')] 我想复制并简化我的数据列表,如下所示: data = [('Date', 'Type', 'Product'), ('2013/03/07', 'Electr

我有一个数据元组列表:

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')]

请帮助我完成此操作。

此代码应该可以帮助您简化数据

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:这可能无法维持原始顺序。

此代码将帮助您简化数据

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:这可能无法保持原始顺序。

由于第三个元素是逗号分隔的字符串,您可以检查它是否存在并相应地拆分

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')]

因为第三个元素是逗号分隔的字符串,所以可以检查它是否存在并相应地拆分

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')]

我认为这样做的一种方法是

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
这将保留顺序,但会在新列表(未就位)上操作。
如果需要的话,我会写一个就地的。

我认为这样做的一个方法是

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
这将保留顺序,但会在新列表(未就位)上操作。
如果需要,我将编写一个就地解决方案。

因此我认为我有更多的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')]

所以我想我有更多的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')]

利用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更新

数据=中e的列表(链(*(产品(*imap(str.split('),'),e)) 我用这行代码来压平我的代码,但它显示了 此错误:“在*之后的类型对象参数必须是序列,而不是 “生成器”,简单的拆分会使用空格和空格分隔所有单词 有什么特别的人物,请帮帮我

备选案文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)))

利用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更新

数据=中e的列表(链(*(产品(*imap(str.split('),'),e)) 我用这行代码来压平我的代码,但它显示了 此错误:“在*之后的类型对象参数必须是序列,而不是 “生成器”,简单的拆分会使用空格和空格分隔所有单词 有什么特别的人物,请帮帮我

备选案文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)))
这是我能做到的最好的

输出:

[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', 'Radio'), 
('2013/03/07', 'Electronic', 'Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')]
这是我能做到的最好的

输出:

[('Date', 'Type', 'Product'), 
('2013/03/07', 'Electronic', 'TV'), 
('2013/03/07', 'Electronic', 'Radio'), 
('2013/03/07', 'Electronic', 'Microwave'), 
('2013/03/07', 'leather', 'Gucci Wallet')]

我尝试了嵌套的“for”循环来解决此问题,但未能成功!:(我尝试嵌套'for'循环来解决此问题,但无法做到!:(data=list(chain(*(product(*imap(str.split(','),e))表示精化的_数据中的e)),我使用这一行来展平我的代码,但它显示了以下错误:“type object argument after*必须是序列,而不是生成器”,简单拆分会将所有单词(即使是空格和任何特殊字符)拆分,请帮助我…data=list(chain(*(product(*imap(str.split('),'),e))在精化的_数据中表示e)),我使用这行代码来展平代码,但它显示了以下错误:“type object argument after*必须是序列,而不是生成器”,简单的拆分会打断所有单词,包括空格和任何特殊字符,请帮助我。