展平内部列表而不更改python中的外部列表
Posted
技术标签:
【中文标题】展平内部列表而不更改python中的外部列表【英文标题】:Flatten inner list without changing outer list in python 【发布时间】:2013-04-14 01:43:00 【问题描述】:因此,只需在 stack-overflow/google 中输入 python flatten list 就会返回大量重复的结果。我已经尝试了所有这些,但没有一个适用于这个特定的实例。
我从 pyodbc 取回了一个数据库结果集,它为我提供了一个数据结构,我可以将其强制转换为列表列表。返回的每一行中的第一个元素(第一列)的格式为"a.b.c"
。我希望它是"a", "b", "c"
。我的第一个直觉是按期分开,我做到了。
之前:
[["a.b.c", "d", 1], ["e.f.g", "h", 2], ... ] # rows left out for brevity
之后:
# unfortunately, split returns a list, which then gets nested
[[["a", "b", "c"], "d", 1], [["e", "f", "g"], "h", 2], ... ]
不过,我想看到的是:
[["a", "b", "c", "d", 1], ["e", "f", "g", "h", 2], ... ]
我尝试了之前关于堆栈溢出的解决方案来展平列表,但是虽然每个人都提到了嵌套列表,但没有人说如何仅展平嵌套列表。
我试过了:
from itertools import chain
for row in rows:
row = list(chain(row)) # python won't allow modifications in a loop
和
rows = [list(chain(row)) for row in rows]
我想一定有一种方法,也许是通过 yield 来做这样的事情:
for row in rows:
row = row[0].append(row[1:]) # but this doesn't work either
我不知道如何修改列表列表中的内部列表。如果有比我迄今为止尝试过的更好的方法,我很想听听。提前感谢您的帮助。
【问题讨论】:
python 不允许在循环中进行修改 - 这并不是阻止你在那种情况下获得你想要的东西的原因......这样做你只是绑定了名字row
到一个新值,它是允许的,但什么也没实现...
【参考方案1】:
怎么样:
>>> s = [["a.b.c", "d", 1], ["e.f.g", "h", 2]]
>>> [k[0].split('.') + k[1:] for k in s]
[['a', 'b', 'c', 'd', 1], ['e', 'f', 'g', 'h', 2]]
这将获取split
在作用于第一个元素后返回的列表,并将其添加到由其余元素组成的列表中。
【讨论】:
+1,没有理由让它嵌套,然后将其展平,更容易一举完成。请注意,在 3.x 中,可以使用[k.split('.') + rest for k, *rest in s]
以便于阅读。
我喜欢这些答案。我目前在 python 2.7 上。升级到 3.3 并使用早期版本的 pyodbc 是否安全?数据库是vertica。另外,为了好奇,有没有办法修复嵌套?
您可以用完全相同的方式“修复”嵌套:[sublist[0] + sublist[1:] for sublist in nested]
(2.7) 或 [head + rest for head, *rest in nested]
(3.x)。
@DSM 如果您将其作为完整答案发布,我肯定会给它+1
@Caleb 我只是猜测最好保持在 2.7 以实现兼容性以上是关于展平内部列表而不更改python中的外部列表的主要内容,如果未能解决你的问题,请参考以下文章