Объединение пониманий списков в Python - PullRequest
2 голосов
/ 14 июля 2020

Можно ли объединить следующие python понимания списка в одну строку? Я знаю, что в этом нет необходимости, мне просто любопытно.

rows = [row.split() for row in data]
flattened = [float(val) for sublist in rows for val in sublist]

Ниже приведен фрагмент файла данных,

['  -.2098335E-03  -.2108988E-03  -.2119629E-03  -.2130240E-03  -.2140826E-03', '  -.2151421E-03  -.2161973E-03  -.2172531E-03  -.2183025E-03  -.2193489E-03', '  -.2203825E-03  -.2214097E-03  -.2224521E-03  -.2235475E-03  -.2246843E-03'....]

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

Спасибо!

Ответы [ 5 ]

1 голос
/ 14 июля 2020

Вложенные понимания списков

Вложенные списки понимания - это не что иное, как list comprehension внутри другого list comprehension, что очень похоже на nested for loops.

Когда мы создаем new list ( квадратов) из элементов existing list, используя list comprehensions, мы пишем:

l1=[1,2,3]
l2=[i**2 for i in l1]
print(l2)

Это дает вывод :

[1, 4, 9]

Мы также можем вложить два или даже больше for loops в это понимание.

Например:

l1=[1,2,3]
l2=[4,5,6]
l3=[[i**2,j**2] for i in l1 for j in l2]
print(l3)

Результат:

[[1, 16], [1, 25], [1, 36], [4, 16], [4, 25], [4, 36], [9, 16], [9, 25], [9, 36]]

Аналогично:

l1=[1,2]
l2=[3,4]
l3=[5,6]
l4=[[i,j,k] for i in l1 for j in l2 for k in l3]
print(l4)

Вывод:

[[1, 3, 5], [1, 3, 6], [1, 4, 5], [1, 4, 6], [2, 3, 5], [2, 3, 6], [2, 4, 5], [2, 4, 6]]

Аналогично ваш код может быть переписан с помощью list comprehensions как:

flattened = [float(val) for sublist in (row.split() for row in data) for val in sublist]

Надеюсь, это вам помогло!

1 голос
/ 14 июля 2020

Поскольку sublist - это ваш row.split(), просто замените его.

data = ['0.3 0.6 0.9', '0.1 0.4 0.3']

flattened = [float(val) for row in data for val in row.split()]

print(flattened) #[0.3, 0.6, 0.9, 0.1, 0.4, 0.3]

Если мы расширим его, он станет более ясным.

data = ['0.3 0.6 0.9', '0.1 0.4 0.3']

#the generator is identically replacing this part
flattened = list()
for row in data:
    for val in row.split():
        flattened.append(float(val))

Все ответы, которые предложите решение ниже, пытаетесь обернуть источник l oop содержимым l oop.

#               v--contents--v      wrapping       v--source       
[float(val) for sublist in (row.split() for row in data) for val in sublist] 

Должно быть наоборот.

[float(val) for row in data for val in row.split()]
1 голос
/ 14 июля 2020

Вы можете просто использовать [float(val) for sublist in (row.split() for row in data) for val in sublist], но он гораздо более читабелен (и его легче отлаживать в будущем), чтобы они не отображались в отдельных строках

0 голосов
/ 14 июля 2020

Один лайнер:

data = ["1 2",
        "3 4",
        "5 6",
        "7 8",
        "9 10"
        ]

rows = [float(val) for row in data for sublist in row.split() for val in sublist]
print(rows)

Возврат:

[1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0, 1.0, 0.0]
0 голосов
/ 14 июля 2020
• 1000 *
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...