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

如何在Python中执行此列表操作?这很棘手

如何在Python中执行此列表操作?这很棘手,python,list,Python,List,假设我有以下列表: [ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ] 什么是最有效的方法将其转化为此列表 [ 5, 7, 1, 44, 21, 32, 73, 99, 100 ] 请注意,我从每个人身上取第一个。然后是每个元素的第二个元素。 当然,这个函数需要使用X元素来完成 我试过了,但我的循环太多了,我觉得太长太复杂了 谢谢。只要所有子列表的长度相同: >>> L1 = [ [5, 44, 73] , [7, 21, 99],

假设我有以下列表:

[ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ]
什么是最有效的方法将其转化为此列表

[ 5, 7, 1, 44, 21, 32, 73, 99, 100 ] 
请注意,我从每个人身上取第一个。然后是每个元素的第二个元素。 当然,这个函数需要使用X元素来完成

我试过了,但我的循环太多了,我觉得太长太复杂了


谢谢。

只要所有子列表的长度相同:

>>> L1 =  [ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ]
>>> L2 = []
>>> map(L2.extend, zip(*L1))
>>> L2
[5, 7, 1, 44, 21, 32, 73, 99, 100]
def flattener(nestedlist):
  if not nestedlist: return []
  return [ x for i in range(len(nestedlist[0]))
             for x in [sublist[i] for sublist in nestedlist]
         ]
lst = [[5, 44, 73] , [7, 21, 99], [1, 32, 100]]
list(reduce(lambda l, r: l + r, zip(*lst)))
比如说,

print flattener([ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ])
准确地发出您想要的平面列表


如果不是所有子列表都需要相同的长度,那么当一些子列表较长,一些子列表较短时,您希望发生什么情况。。。?如果需要考虑这种不平等性,则需要一个精确的规范。

这里有一个O^2解决方案,它假设所有内部数组的长度相同

parent = [ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ]
final = []
for i in range(len(parent[0])):
    for x in range(len(parent)):
        final.append(parent[x][i])
print final # [5, 7, 1, 44, 21, 32, 73, 99, 100]

只要所有子列表的长度相同:

def flattener(nestedlist):
  if not nestedlist: return []
  return [ x for i in range(len(nestedlist[0]))
             for x in [sublist[i] for sublist in nestedlist]
         ]
lst = [[5, 44, 73] , [7, 21, 99], [1, 32, 100]]
list(reduce(lambda l, r: l + r, zip(*lst)))
编辑:这将适用于不同长度的子列表:

lst = [[5, 44, 73, 23] , [7, 21, 99], [1, 32, 100]]
list(filter(lambda p: p is not None, reduce(lambda x, y: x + y, map(None, *lst))))
如果您需要不同长度的列表:

import itertools
[x for x in itertools.chain(*itertools.izip_longest(*L1)) if x is not None]

第二个深度的简单列表理解:

>>> L = [ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ]
>>> [x for li in zip(*L) for x in li]
[5, 7, 1, 44, 21, 32, 73, 99, 100]
很好。如果子列表长度不均匀,则表示以下内容就不那么优雅:

>>> L = [ [5, 44, 73] , [7], [1, 32, 100, 101] ]
>>> [li[idx] for idx in xrange(max(map(len, L))) for li in L if idx < len(li)]
[5, 7, 1, 44, 32, 73, 100, 101]
>>L=[[5,44,73],[7],[1,32,100,101]]
>>>[li[idx]表示X范围内的idx(如果idx
这些解决方案的复杂性为O(n),其中n是元素的总数。

“一行”!=“蟒蛇”

仅仅为了在一行中实现for循环而使用列表理解是不好的。保存列表表达式或生成器表达式,以便在需要表达式结果时使用。在我看来,最清晰、最具Python风格的是(对于长度相等的子列表):

当然你可以这样写:

[ L2.extend(nextitems) for nextitems in zip(*L1) ]
但这会生成一个
[None,None,…]
列表,只要每个子列表中的项目数相同,因为
extend()
返回None。那么我们用这个列表做什么呢?没有,所以它会被立即丢弃。但是读者在意识到这个列表是为了在每个创建的子列表上运行
extend()
而“构建”的之前,必须先看一下这个列表


Pythonicness是通过使用zip和*L1将L的子列表作为args传递给zip得到的。列表理解通常也被认为是python式的,但当它们用于创建事物列表时,不是作为for循环的聪明快捷方式。

你能保证所有内部数组的长度都相同吗?嗯,不是真的。。在不使用返回值的情况下使用map被认为是非常糟糕的做法……但它会使代码更短:)或者:list(itertools.chain(*zip(*L1)))这具有纯功能性的优点。。。如果你对这类事情感兴趣。@Phil:我的答案和你的评论同时发布了Phil:它怎么能起作用,它依赖于map-1的副作用来表示“我在范围内(len(listvar)):”-use“for元素在listvar:”。你道歉的O(n^2)部分在哪里?保罗,你说得对,这个成语的精髓在于zip()和*param;map()使它成为一个单行程序,但它给了我们这个问题,并从extend()返回。我不是在一行(实际上是在二级语言的初始化中的两行)上下了很多功夫,而是在函数式编程和强大的内置列表/可移植特性的混合上下功夫,但正如所说的,在这个特殊的用法中并不是很像pythonic+祝你好运!我发现Paul的方法比map更快,但用过滤器代替map更快。这是我最喜欢的答案。是的,使用for循环多次执行操作;为什么使用
map()
filter()
?顺便说一下,在Python2.x中,您可能希望使用
itertools.izip()
而不是
zip()
。-1:
reduce
很少是最有效的。你有没有对照其他答案来衡量一下这是否是最有效的?-1:导入操作员;list(reduce(operator.add,zip(*lst)))operator.add将比lambda更快
>>> L1 =  [ [5, 44, 73] , [7, 21, 99], [1, 32, 100] ]
>>> L2 = list(sum(zip(*L1), ()))
>>> L2
[5, 7, 1, 44, 21, 32, 73, 99, 100]