2015-09-01 75 views
2

所以我有一个列表中的列表中的“合并”的列表:使用列表理解列表

每一个嵌套列表是相同的:前2个元素是由字母串,其余都是字符串由数字组成。

我想所有的串号转换为花车和各相应的嵌套列表的串号集中到自己的列表(这最终是一个双嵌套列表),所以最后的结果是这样的:

final = [['abc','efg', [ 4.3, 5.7, 80085]], ['aba','bab', [ 1.0, 9.0, 3.0]] , ... , ... ] 

所以我的方法是使用列表理解将字符串数字转换为浮点数,然后将这些数字和字母串分割成单独的列表并合并它们。

bloop = [[float(x) for x in y[2:]] for y in woot] 

bleep = [[x for x in y[:2]] for y in woot] 

所以我结束了:

bloop = [[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0], ... , ... ] 
bleep = [['abc','efg'],['aba','bab'], ... , ... ] 

这里是我打破,似乎无法绕到我的头“合并”这些名单。

final = [] 
for i in bleep: 
    final.append(i) 
for i in bloop: 
    final.append(i) 

不幸的是,这只是把名单在一起,例如:

[['abc','efg'],['aba','bab'],[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0]] 
+0

什么你问它这正是做... – jonrsharpe

+0

边注:'[[X中X Y [2]在活泉Y]'等同于'[ y [:2] for y in woot]' –

+1

另一面说明:尽量不要滥用list理解。它可以在大多数情况下为你节省几个字符,但它也可能使你的代码难以阅读和缓慢。 –

回答

3

什么:

final = [x[:2] + [[float(f) for f in x[2:]]] for x in woot] 
+0

语法错误?关闭']'丢失。 – mhawke

+0

@mhawke修正,谢谢。我的回答完全错误,对此感到遗憾。 – Delgan

+0

是的,修复...并在这样做你的答案现在是我的一样(在我修好了我的后):) – mhawke

3

简化你的逻辑:

final = [] 
for l in woot: 
    adjusted = l[:2] 
    adjusted.append([float(x) for x in l[2:]]) 
    final.append(adjusted) 

调试比编写代码要困难一倍。 因此,如果您尽可能巧妙地编写代码,您可以通过定义 来调试它。

— Brian W. Kernighan and P. J. Plauger in The Elements of Programming Style. 

参考:http://quotes.cat-v.org/programming/

+1

我接受你的观点,但列表的理解不是太“聪明”。他们是肉和3素食的Python。在这种情况下,产生所需输出的列表理解是微不足道的。 – mhawke

+0

你能否详细说明你的意思是不是太“聪明”? – user155876

+0

@ user155876:这是对此答案中引用的引用“尽可能巧妙地编写代码”。我的观点是,列表解析是一种基本的Python语言特性,它们不一定是聪明的。当然,写一个很难解读的列表理解是很容易的,然而,在这个特定的情况下,所需的列表理解完全不是太复杂。 – mhawke

1

这里是一个列表理解产生您所需的输出:

>>> [t[:2] + [[float(f) for f in t[2:]]] for t in woot] 
[['abc', 'efg', [4.3, 5.7, 80085.0]], ['aba', 'bab', [1.0, 9.0, 3.0]]] 
0

下面的想法使用列表中理解和切片的语法来分割每个子清单到包含子0,子-1和列表中索引2..n的项目列表中。这是通过使用list类型的+运算符来完成的。

为了简洁起见,我使用了map而不是内部理解,但如果您使用[float(ysub) for ysub in y[2:]],则没有功能差异。

woot = [['abc','efg', '4.3', '5.7', '80085'],['aba','bab', '1.0', '9.0', '3.0']] 
print [y[:2] + [map(float, y[2:])] for y in woot] 
[['abc', 'efg', [4.3, 5.7, 80085.0]], ['aba', 'bab', [1.0, 9.0, 3.0]]] 
+1

尽管此代码可能会回答这个问题,但提供关于此代码为何和/或如何回答问题的其他上下文会提高其长期价值。 – NathanOliver

+0

好主意,做完了! –

0

这似乎工作:

final = [l[0:2]+[list(map(float,l[2:]))] for l in woot] 

但也许我欺骗,因为我使用map ...使用

+0

使用'list(map())'与使用列表理解没有任何区别。它会产生相同的结果,实际上不是“作弊”。 – dsh

+0

当然,但他问如何做列表理解,我没有完全使用列表理解。我知道这不是“作弊”,它只是一种不同的继续。 – ibi0tux

0

您的哔哔这里BLOOP精细答案

bloop = [[ 4.3, 5.7, 8005.0],[ 1.0, 9.0, 3.0]] 
bleep = [['abc','efg'],['aba','bab']] 
final =[] 
for i in range(len(bleep)): 
    final.append(bleep[i]+[bloop[i]]) 
print final 
0

充足,我只是想指出的是,扩展语法一般是更好的。另外,尽量避免嵌套列表理解。它几乎总是比较清楚的,就是为每个嵌套级别编写一个函数,并在每个级别中放置一个列表理解。所以,我会做:

def process_list(l) : 
    #processes the sub list 
    new_list = l[:2] 
    new_list.extend([float(x) for x in l[2:]) 
    return new_list 

result = [process_list(l) for l in original_list]