在不更改python中的外部列表的情况下展平内部列表

Cal*_*leb 1 python nested list flatten

因此,只需在python展平列表中输入stack-overflow/google就会带来大量重复的结果.我已经尝试了所有这些,并且在这个特定实例中都没有适用.

我从pyodbc返回一个数据库结果集,它给了我一个数据结构,我可以强制到列表列表.返回的每行中的第一个元素(第一列)是在表单中"a.b.c".我希望它是"a", "b", "c".我的第一直觉是分裂时期,我做了.

之前:

[["a.b.c", "d", 1], ["e.f.g", "h", 2], ... ] # rows left out for brevity
Run Code Online (Sandbox Code Playgroud)

后:

# unfortunately, split returns a list, which then gets nested
[[["a", "b", "c"], "d", 1], [["e", "f", "g"], "h", 2], ... ]
Run Code Online (Sandbox Code Playgroud)

但是,我想看到的是:

[["a", "b", "c", "d", 1], ["e", "f", "g", "h", 2], ... ]
Run Code Online (Sandbox Code Playgroud)

我尝试使用堆栈溢出的先前解决方案来展平列表,但是当每个人都提到嵌套列表时,没有人说如何展平嵌套列表.

我试过了:

from itertools import chain
for row in rows:
    row = list(chain(row)) # python won't allow modifications in a loop
Run Code Online (Sandbox Code Playgroud)

rows = [list(chain(row)) for row in rows]
Run Code Online (Sandbox Code Playgroud)

我想必须有一种方法,也许是收益率,做一些像:

for row in rows:
    row = row[0].append(row[1:]) # but this doesn't work either
Run Code Online (Sandbox Code Playgroud)

我不知道如何修改列表列表中的内部列表.如果有比我迄今为止尝试过的更好的方式,我很乐意听到它.在此先感谢您的帮助.

DSM*_*DSM 7

怎么样:

>>> 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]]
Run Code Online (Sandbox Code Playgroud)

这将获取split在作用于第一个元素后返回的列表,并将其添加到由其余元素组成的列表中.

  • +1,没有理由让它嵌套,然后把它弄平,更容易一举做到这一点.请注意,在3.x中,可以执行`[k.split('.')+ rest for k,*rest in s]`以便于阅读. (2认同)