使用列表理解来"合并"列表中的列表

时间:2015-09-01 13:23:19

标签: python list

所以我在列表中有列表:

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

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

我试图将所有字符串数字转换为浮点数并将每个相应的嵌套列表的字符串数字汇集到它自己的列表中(最终是一个双嵌套列表),因此最终结果看起来像:

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'], ... , ... ]

这就是我打破的地方,似乎无法绕过我的脑海,并且#34;合并"这些清单。

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

7 个答案:

答案 0 :(得分:3)

怎么样:

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

答案 1 :(得分: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/

答案 2 :(得分: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]]]

答案 3 :(得分:0)

下面的想法使用列表理解和切片语法将每个子列表拆分为包含sub-0,sub-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]]]

答案 4 :(得分:0)

这似乎有效:

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

但也许我作弊因为我使用map ...

答案 5 :(得分: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

答案 6 :(得分: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]