Сгладить внутренний список без изменения внешнего списка в python

Таким образом, просто ввод списка выравнивания 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

После:

# 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]

Я предполагаю, что должен быть способ, возможно, с доходностью, сделать что-то вроде:

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

Я не знаю, как изменить внутренние списки в списке списков. Если есть лучший способ, чем то, что я пробовал до сих пор, я хотел бы услышать его. Заранее спасибо за вашу помощь.


person Caleb    schedule 20.04.2013    source источник
comment
python не допускает изменений в цикле. Это не то, что мешает вам получить то, что вы хотите в этой ситуации... делая это, вы просто привязываете имя row к новому значению, это < i>разрешено, но ничего не получается...   -  person jamylak    schedule 21.04.2013


Ответы (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 возвращает после воздействия на первый элемент, и добавляет его в список, состоящий из остальных элементов.

person DSM    schedule 20.04.2013
comment
+1, нет причин делать его вложенным, а затем сглаживать, проще сделать это одним махом. Обратите внимание, что в 3.x можно сделать [k.split('.') + rest for k, *rest in s] для облегчения чтения. - person Gareth Latty; 21.04.2013
comment
Мне нравятся эти ответы. Я сейчас на питоне 2.7. Безопасно ли переходить на версию 3.3 и использовать более раннюю версию pyodbc? База данных vertica. Кроме того, есть ли способ исправить вложенность, ради любопытства? - person Caleb; 21.04.2013
comment
Восстановить вложенность можно точно так же: [sublist[0] + sublist[1:] for sublist in nested] (2.7) или [head + rest for head, *rest in nested] (3.x). - person DSM; 21.04.2013
comment
@DSM, если вы опубликуете это как полный ответ, я определенно поставлю +1 - person Caleb; 21.04.2013
comment
@Caleb Я просто думаю, что было бы лучше остаться на 2.7 для совместимости - person jamylak; 21.04.2013