相关疑难解决方法(0)

如何从列表列表中制作一个平面列表?

我想知道是否有一条快捷方式可以在Python列表中列出一个简单的列表.

我可以在for循环中做到这一点,但也许有一些很酷的"单行"?我用reduce尝试了,但是我收到了一个错误.

l = [[1, 2, 3], [4, 5, 6], [7], [8, 9]]
reduce(lambda x, y: x.extend(y), l)
Run Code Online (Sandbox Code Playgroud)

错误信息

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "<stdin>", line 1, in <lambda>
AttributeError: 'NoneType' object has no attribute 'extend'
Run Code Online (Sandbox Code Playgroud)

python list flatten multidimensional-array

2950
推荐指数
29
解决办法
184万
查看次数

压扁不规则的列表列表

是的,我知道这个主题已经被覆盖过了(这里,这里,这里,这里),但据我所知,除了一个之外,所有解决方案都在这样的列表中失败:

L = [[[1, 2, 3], [4, 5]], 6]
Run Code Online (Sandbox Code Playgroud)

期望的输出是什么

[1, 2, 3, 4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

或者甚至更好,一个迭代器.我看到的唯一适用于任意嵌套的解决方案可以在这个问题中找到:

def flatten(x):
    result = []
    for el in x:
        if hasattr(el, "__iter__") and not isinstance(el, basestring):
            result.extend(flatten(el))
        else:
            result.append(el)
    return result

flatten(L)
Run Code Online (Sandbox Code Playgroud)

这是最好的型号吗?我忽略了什么吗?任何问题?

python optimization list flatten

412
推荐指数
16
解决办法
12万
查看次数

在Python中展平浅层列表

是否有一种简单的方法可以使用列表推导来展平迭代列表,或者失败,你会认为什么是平衡这样的浅层列表,平衡性能和可读性的最佳方法?

我尝试使用嵌套列表理解来压缩这样的列表,如下所示:

[image for image in menuitem for menuitem in list_of_menuitems]
Run Code Online (Sandbox Code Playgroud)

但我在NameError那里遇到麻烦,因为name 'menuitem' is not defined.谷歌搜索并浏览Stack Overflow后,我得到了一个reduce声明所需的结果:

reduce(list.__add__, map(lambda x: list(x), list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)

但是这个方法相当难以理解,因为我需要那个list(x)调用,因为x是一个Django QuerySet对象.

结论:

感谢所有为此问题做出贡献的人.以下是我学到的内容摘要.我也将其作为社区维基,以防其他人想要添加或更正这些观察结果.

我原来的reduce语句是多余的,用这种方式编写得更好:

>>> reduce(list.__add__, (list(mi) for mi in list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)

这是嵌套列表理解的正确语法(Brilliant summary dF!):

>>> [image for mi in list_of_menuitems for image in mi]
Run Code Online (Sandbox Code Playgroud)

但这些方法都不如使用效率高itertools.chain:

>>> from itertools import chain
>>> list(chain(*list_of_menuitems))
Run Code Online (Sandbox Code Playgroud)

正如@cdleary指出的那样,通过使用chain.from_iterable如下所示来避免*操作符魔术可能是更好的风格:

>>> chain = itertools.chain.from_iterable([[1,2],[3],[5,89],[],[6]])
>>> print(list(chain))
>>> [1, 2, …
Run Code Online (Sandbox Code Playgroud)

python list-comprehension

382
推荐指数
10
解决办法
17万
查看次数

加入python中的列表列表

在python中将列表列表加入单个列表(或迭代器)的简短语法是什么?

例如,我有一个如下列表,我想迭代a,b和c.

x = [["a","b"], ["c"]]
Run Code Online (Sandbox Code Playgroud)

我能想到的最好的是如下.

result = []
[ result.extend(el) for el in x] 

for el in result:
  print el
Run Code Online (Sandbox Code Playgroud)

python

284
推荐指数
10
解决办法
31万
查看次数

扁平化浅层嵌套列表的成语:它是如何工作的?

我在我正在处理的模块中找到了这段代码:

l = opaque_function()
thingys = [x for y in l for x in y]
Run Code Online (Sandbox Code Playgroud)

我看不懂这个.通过实验,我能够确定它是否展平了2级嵌套列表,但是syntex对我来说仍然是不透明的.它显然省略了一些可选括号.

>>> l = [[1,2],[3,4]]
>>> [x for y in l for x in y]
[1, 2, 3, 4]
Run Code Online (Sandbox Code Playgroud)

我的眼睛想要将它解析为:[x for y in [l for x in y] ]或者[ [x for y in l] for x in y ],但是由于y没有被定义,两者都失败了.

我该怎么读这个?

(我怀疑在解释这个问题时我会感到非常尴尬.)

python

6
推荐指数
3
解决办法
214
查看次数

如何将列表列表展平一步

我有一个元组列表列表

A= [ [(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)] ]
Run Code Online (Sandbox Code Playgroud)

外部列表可以具有任意数量的内部列表,内部列表可以具有任意数量的元组,元组总是具有3个整数.

我想生成元组的所有组合,每个列表中有一个:

[(1,2,3),(7,8,9),(2,1,0)]
[(1,2,3),(7,8,9),(1,3,5)]
[(1,2,3),(8,7,6),(2,1,0)]
...
[(4,5,6),(5,4,3),(1,3,5)]
Run Code Online (Sandbox Code Playgroud)

一个简单的方法是使用类似的函数itertools.poduct() 但必须像这样调用它

itertools.product([(1,2,3),(4,5,6)], [(7,8,9),(8,7,6),(5,4,3)],[(2,1,0),(1,3,5)])
Run Code Online (Sandbox Code Playgroud)

即删除外部列表.我不知道该怎么做.有没有更好的方法来生成元组的所有组合?

python

2
推荐指数
1
解决办法
1050
查看次数

Python - 解压缩列表列表

实现以下内容的最简洁方法是什么:

list = [list1, list2, ...]
return [*list1, *list2, ...]
Run Code Online (Sandbox Code Playgroud)

看起来这个语法将在Python 3.5中提供.与此同时,您的解决方案是什么?

python

2
推荐指数
1
解决办法
3997
查看次数

python将两个元组列表组合成一个大的元组列表?

我四处搜索,似乎没有人问过这个问题(或者至少我找不到)。

我有两个元组列表,我想将它们加入一个元组列表。

first = [('a', 1), ('b',2)]
second = [('c',3), ('d',4)]
Run Code Online (Sandbox Code Playgroud)

我试过追加、加入、压缩,但没有一个是完全正确的。我想得到这个:

wanted = [('a', 1), ('b',2), ('c',3), ('d',4)]
Run Code Online (Sandbox Code Playgroud)

有没有一种简单的方法可以做到这一点?

编辑:我觉得真的很愚蠢......当然这是我忘记尝试的一件事:(

python tuples list

1
推荐指数
1
解决办法
6907
查看次数