所以我有list of lists
这样:
my_list = [['hi','Ohio',[1,0.0]],['bye','NewYork',[2,0.0]],['go','Maine',[3,0.0]]]
如您所见,它有3种不同的类型(string
,ints
和floats
)。
我需要将这些子列表“加入”以输出一个包含以下形式的新列表:
>>> 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,但似乎会扩展我列表中的每个条目,我不想要
任何帮助和/或提示都会很棒!
答案 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
来展平每个项目,然后join
,join
之后每个列表中每个第三项的元素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中展平。这些大多数都没有为字符串添加特殊情况,但这可能无关紧要。