Как поместить в список понимание двух циклов? - PullRequest
0 голосов
/ 05 февраля 2019

Я ищу ответ, как поместить в список два цикла for, где один цикл for встроен во второй.Можно ли избежать использования циклов for и в этом примере?Цель этого примера должна состоять в том, чтобы извлечь значения в один список из списков, которые встроены в другой список.

slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
li = list(slov.keys())
hod = [i for i in li if len(i)==3]
slo = []

for k in hod:
    j = slov[k]
    for l in j:
        slo.append(l)

Заранее спасибо.

Ответы [ 4 ]

0 голосов
/ 05 февраля 2019

Другая пара вложенных опций.

Сначала создайте новый dict с ключами, соответствующими условию:

[ item for values in { k: v for k, v in slov.items() if len(k) == 3 }.values() for item in values ]


Или создайте список сзначения, ключи которых соответствуют условию:
[ item for values in [ v for k, v in slov.items() if len(k) == 3 ] for item in values ]

Эта часть [ v for k, v in slov.items() if len(k) == 3 ] возвращает результат в виде вложенного списка [[1.0, 2.0], [6.0]], поэтому необходимо сгладить его вложение в понимании списка.


Оба возвращаются #=> [1.0, 2.0, 6.0]

0 голосов
/ 05 февраля 2019

Вы можете использовать itertools.chain, чтобы сгладить список значений для ключей, длина которых составляет 3:

from itertools import chain

slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}

slo = list(chain.from_iterable(slov[k] for k in slov if len(k) == 3))

print(slo)
# [1.0, 2.0, 6.0]
0 голосов
/ 05 февраля 2019

Я мог видеть несколько ответов, уже приведенных выше.Ниже вы найдете слегка измененную версию того же самого.

slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
print ([j for k, i in slov.items() if len(k) == 3 for j in i]) # Outer Loop (for k, i in slov.items() if len(k) == 3), Inner Loop (for j in i)

# Output - [1.0, 2.0, 6.0]

Надеюсь, это считается ...:)

0 голосов
/ 05 февраля 2019

Использование for-циклов делает ваш код более читабельным и понятным, однако, если вы настаиваете на понимании однострочного списка, вот оно:

slov = {"abc":[1.0, 2.0], "b": [3.0], "a12": [6.0]}
slo = [l for k in (i for i in slov.keys() if len(i)==3) for l in slov[k]]

print(slo)

Вывод:

[1.0, 2.0, 6.0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...