Python - “加入”不同类型列表的列表

时间:2015-03-31 15:30:09

标签: python list python-2.7 join list-comprehension

所以我有list of lists这样:

my_list = [['hi','Ohio',[1,0.0]],['bye','NewYork',[2,0.0]],['go','Maine',[3,0.0]]]

如您所见,它有3种不同的类型(stringintsfloats)。

我需要将这些子列表“加入”以输出一个包含以下形式的新列表:

>>> new_list

[['hiOhio10.0'], ['byeNewYork20.0'], ['goMaine30.0']] 

为此,我尝试了以下'list comprehension':

>>> new_list = [["".join(["".join(str(a)) for a in b])] for b in mylist]

但这给了我输出:

>>> new_list

[['hiOhio[1, 0.0]'], ['byeNewYork[2, 0.0]'], ['goMaine[3, 0.0]']]

这不是我追求的目标。

我尝试过的其他事情:

  1. 在之前显示的列表理解中添加另一个for循环。

    例如:

    [[["".join(["".join(str(c)) for c in a])]for a in b] for b in my_list]
    

    但是这给了我这个错误:

    Traceback (most recent call last):
      File "<pyshell#88>", line 1, in <module>
        [[["".join(["".join(str(c)) for c in a])]for a in b] for b in my_list]
    TypeError: 'int' object is not iterable
    
  2. 我也尝试在'list flattening'上关注this SO question,但似乎会扩展我列表中的每个条目,我不想要

  3. 任何帮助和/或提示都会很棒!

5 个答案:

答案 0 :(得分:3)

您可以尝试此列表理解

>>> [[''.join(i[:2])+''.join(map(str,my_list[0][2]))] for i in my_list]
[['hiOhio10.0'], ['byeNewYork10.0'], ['goMaine10.0']]

假设 - 子列表总是如上所述

文档 - map

答案 1 :(得分:3)

更具可读性且不易出错:

def concat(item):
    if type(item) is list:
        return ''.join([concat(i) for i in item])
    # else:
    return str(item)

[concat(item) for item in my_list]

答案 2 :(得分:1)

我们可以使用map运行lambda来展平每个项目,然后joinjoin之后每个列表中每个第三项的元素map(lambda x: ["".join([x[0], x[1], "".join(map(str, x[2]))])], my_list)

[['hiOhio10.0'], ['byeNewYork20.0'], ['goMaine30.0']]

<强>结果

{{1}}

答案 3 :(得分:1)

为什么你可以简单地用for循环

来复杂
     new_list=[''.join(str(y)  for x in z for y in x) for z in my_list]

答案 4 :(得分:0)

假设你有一个函数来压缩任意嵌套的迭代,你可以这样做:

[''.join(map(str, flatten(sublist))) for sublist in my_list]

这是我使用的flatten(改编自How can I flatten lists without splitting strings?

def flatten(it):
    for item in it:
        if hasattr(item, '__iter__') and not isinstance(item, basestring):
            for subitem in flatten(item):
                yield subitem
        else:
            yield item

还有其他好方法可以在flattening a shallow list in python中展平。这些大多数都没有为字符串添加特殊情况,但这可能无关紧要。