понимание списка не оценивается как ожидалось - PullRequest
1 голос
/ 15 апреля 2019

У меня есть следующий список:

z = [
[7,None], 
[9,None], 
[None,7], 
[None, 15], 
[None, None], 
[2,None], 
[0,None]]

.. и я хотел получить список, который вернет целое число в элементе, если оно есть, даже если он равен 0, и вернет 1 для элементагде оба подэлемента равны None.

Я дошел до этого:

[a or b if (a!=0 and b!=0) else 0 if set([a,b])=={0,None} else 1 if set([a,b])=={None} else -10 for a,b in z]

.., который почти работает, он возвращает:

[7, 9, 7, 15, None, 2, 0]

Такему не удалось превратить элемент [None, None] в 1. Кто-нибудь знает, как это исправить?

Бит else -10 как раз здесь, так как я считаю, что составление списка, написанное так, должно заканчиваться else если вы пропустите это, вы получите SyntaxError

Ответы [ 3 ]

5 голосов
/ 15 апреля 2019

Как насчет этого?

[a if a is not None else b if b is not None else 1 for a, b in z]

Вывод:

[7, 9, 7, 15, 1, 2, 0]
3 голосов
/ 15 апреля 2019

Вы также можете использовать genexp, чтобы отфильтровать элементы, которые не идентичны None, и использовать его с next и значением по умолчанию, например:

[next((el for el in lst if el is not None), 1) for lst in z]           
# [7, 9, 7, 15, 1, 2, 0]
2 голосов
/ 15 апреля 2019

Я бы написал выражение как (вызывая первый элемент a, а второй b):

(1 if b is None else b) if a is None else a

Это сразу читается довольно задом наперед, но так работает троичное выражение. Таким образом, понимание списка

[(1 if b is None else b) if a is None else a for a, b in z]
...