Python - "Joining" 不同类型列表列表

Python - "Joining" list of lists of different types

所以我有一个 list of lists 这样的:

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

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

我需要 'join' 子列表一起输出一个新的列表,格式为:

>>> 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,但它似乎会扩展我列表中的 every 条目我不想要

任何帮助 and/or 提示都会很棒!

你可以试试这个list-comprehension

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

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

文档 - map

我们可以使用 map 到 运行 一个 lambda 来展平每个项目并 joins 它们,之后 joins 每个项目的元素每个列表中的第三项:

map(lambda x: ["".join([x[0], x[1], "".join(map(str, x[2]))])], my_list)

结果

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

可读性更高,更不容易出错:

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]

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

[''.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 中还有其他很好的扁平化方法。这些大多不添加字符串的特殊情况,但这可能无关紧要。

既然可以简单地使用 for 循环来完成,为什么还要复杂呢

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