2014-09-23 1 views
1

Я запутался с помощью следующей строки кода:В Python, как делает «если-то еще и» в словаре понимания работы

data = {n.attributes['xid']: float(n.content) if n.content else np.nan for n in graph.by_tag('value') } 

Словарь постижение состоит из if-else и for цикла. Может ли кто-нибудь объяснить мне, как работает код?

ответ

0

Помогает ли вам перевод?

data = {} 
for n in graph.by_tag('value'): 
    if n.content: 
     data[n.attributes['xid']] = float(n.content) 
    else: 
     data[n.attributes['xid']] = np.nan 
+0

Многое ясное объяснение. – MJP

+0

Даты понимания dictionay = {n.attributes ['xid']: str (n.content) для n в date.by_tag ('value')}. Могу ли я сокращать понимание dict следующим образом: date = {} для n в date.by_tag ('значение'): даты [n.attributes ['xid']] = str (n.content) – MJP

+0

Почти, но вы нужно использовать другое имя переменной (вы переписываете «даты» в первой строке). –

2

Вы смущены ... if ... else ... conditional expression. Он не является частью цикла, он является частью выражения, генерирующего значение для каждой пары ключ-значение.

Словарь понимание состоит из по меньшей мере одного цикла, с необязательно более петель и if фильтров на правой стороне, и два выражения слева. Одно выражение для создания ключа, а другое - для создания значения. Вместе эти два выражения делают пару ключ-значение для результирующего словаря:

{key_expression: value_expression for target in iterable} 

Условное выражение просто производит значение, основанное на испытании. Либо тест оценивается как истинное и одно значение выбрано, или значение является ложным, а другой выбрал:

true_expression if test else false_expression 

только выражение выбрал оценивается; если test заканчивается как false, выполняется false_expression, и результат возвращается, true_expression игнорируется полностью.

Таким образом, словарь понимания вы смотрите на это эквивалент:

data = {} 
for n in graph.by_tag('value'): 
    key = n.attributes['xid'] 
    value = float(n.content) if n.content else np.nan 
    data[key] = value 

Так value либо установлен float(n.content) или np.nan, в зависимости от значения n.content (truethy или нет).

+0

Спасибо за помощь. Есть ли у вас учебник по спискам и разборки. Пожалуйста, часто меня поражают эти компромиссы. Я больше в datascience. – MJP

+0

@ user3796494: учебник Python [охватывает список понятий] (https://docs.python.org/2/tutorial/datastructures.html#list-comprehensions); после того, как у вас есть список понятий под вашим поясом, выражения генератора, а также установки и диктовки не отличаются. –

+0

@MartijinPieters - В чем разница между этими двумя списками: data = {n.attributes ['xid']: float (n.content), если n.content else np.nan для n в graph.by_tag ('value')} данные = {n.attributes ['xid']: float (n.content) для n в графе.by_tag ('значение'), если n.content else np.nan} – MJP