Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/308.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 - Fatal编程技术网

用python展平列表

用python展平列表,python,Python,我有这样一份清单: [[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...] 此列表中的每个项可能包含一个数据对或元组,我想将此列表更改为 [(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...] 然后这样做: for item in list: reqs = reqs + item[1]

我有这样一份清单:

[[(video1,4)], [(video2,5),(video3,8)], [(video1,5)], [(video5, 7), (video6,9)]...]
此列表中的每个项可能包含一个数据对或元组,我想将此列表更改为

[(video1,4),(video2,5),(video3,8),(video1,5),(video5,7),(video6,9)...]
然后这样做:

for item in list:
    reqs = reqs + item[1]
    b.append(item[0])
c = set(b)

我不知道如何更改列表结构,或者如何基于原始列表执行相同的计算?

要展平一个级别,可以使用
itertools.chain.from\u iterable()


如果您只想展平列表,只需使用
itertools.chain.from\u iterable

尝试以下操作:

from itertools import chain 

c = set()
reqs = 0
for vid, number in chain(*your_list): 
    c.add(vid)
    reqs += number 
另见相关帖子


使用
chain.from_iterable(list)
而不是
chain(*list)
,性能的提高应该可以忽略不计,但前者确实看起来更干净

要从数据结构中提取所有元组

def get_tups(y):
    z = []
    if y:
        for x in y:
            if isinstance(x, tuple):
                z.append(x)
            else:
                z.extend(get_tups(x))
    return z
也许…

这里还有一个(没有库):


有一种非常简单的方法可以通过列表理解来实现这一点。python文档中已经记录了这个示例

下面是您想要实现的解决方案。根据您的示例,这是最简单的解决方案

In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]]

In [60]: improved_list = [num for elem in your_list for num in elem]

In [61]: improved_list
Out[61]: 
[('video1', 4),
 ('video2', 5),
 ('video3', 8),
 ('video1', 5),
 ('video5', 7),
 ('video6', 9)]

如果此列表是单独嵌套的(列表列表),您可以这样做,我经常使用它:

flat_list = sum(list_of_lists, [])
这是因为sum只是简单地将列表相加,而将列表相加在python中也能像预期的那样工作:)


注意:这是低效的,有些人说不可读。

您是否需要示例列表中的
?如果没有它,这将是一个有效的例子。你到底想要实现什么?一组
c
videoX
变量和您列出的其他数字的总和?@jamylak no。。。。这意味着有更多类似的数据,我不想列出它们all@Shep是的,这个列表包含很多数据,不仅仅是我在这里列出的数据,但基本上这就是我想要的do@Marcin:你说得对,努比就是这么叫的证明,似乎需要证明,数字对你有害;)如果我调用
get_tups([('foo',)])
,会发生什么?因为输入包含1个元组,所以您将得到一个包含1个元组的列表。换句话说,输出将与输入相同;)如果我再叫一次会怎么样?这里有一个提示:啊。为什么z在第二次调用时不是空列表?因为您在代码中向它附加了一个值,并且表达式
z=[]
作为
def
语句的一部分进行计算。为什么要创建命名函数而不是lambda?只是为了清楚起见,没有特殊原因。
>>> # flatten a list using a listcomp with two 'for'
>>> vec = [[1,2,3], [4,5,6], [7,8,9]]
>>> [num for elem in vec for num in elem]
[1, 2, 3, 4, 5, 6, 7, 8, 9]
In [59]: your_list = [[('video1',4)], [('video2',5),('video3',8)], [('video1',5)], [('video5', 7), ('video6',9)]]

In [60]: improved_list = [num for elem in your_list for num in elem]

In [61]: improved_list
Out[61]: 
[('video1', 4),
 ('video2', 5),
 ('video3', 8),
 ('video1', 5),
 ('video5', 7),
 ('video6', 9)]
flat_list = sum(list_of_lists, [])