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 种不同的类型(string
、ints
和 floats
)。
我需要 '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]']]
这不是我想要的。
我尝试过的其他事情:
在前面显示的列表理解中添加另一个 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
我也试过在 '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
来展平每个项目并 join
s 它们,之后 join
s 每个项目的元素每个列表中的第三项:
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]
所以我有一个 list of lists
这样的:
my_list = [['hi','Ohio',[1,0.0]],['bye','NewYork',[2,0.0]],['go','Maine',[3,0.0]]]
如您所见,它有 3 种不同的类型(string
、ints
和 floats
)。
我需要 '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]']]
这不是我想要的。
我尝试过的其他事情:
在前面显示的列表理解中添加另一个 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
我也试过在 '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
来展平每个项目并 join
s 它们,之后 join
s 每个项目的元素每个列表中的第三项:
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]