Python字典理解难以理解

6

(抱歉,无法抵制这个双关语!)

我想知道为什么似乎不能翻译:

dict([(str(x),x) if x % 2 else (str(x),x*10) for x in range(10)])

使用字典解析将其转化为更易读的表达式:
{str(x):x if x % 2 else str(x):x*10 for x in range(10)}

顺便提一下,第一个可以写成:dict((str(x),x if i%2 else x*10) for x in range(10))以与thg435的解决方案对称。(我还将列表推导式更改为生成器,因为...为什么不呢?) - mgilson
3个回答

8
{ str(x):(x if x % 2 else x*10) for x in range(10) }

看起来运作良好。


6
这是您需要翻译的内容:my advice {str(x):(x if x % 2 else x*10) for x in range(10)} - more readable one我的建议是将这段代码变得更易读,代码如下:{str(x): (x if x % 2 == 1 else x * 10) for x in range(10)} - Alexey Kachayev
@AlexeyKachayev:这个网站是协作编辑的,你不知道吗?如果你有有用的建议,只需编辑帖子即可! - georg
请注意,字典推导仅适用于v2.7+版本。 - John Wang

1

优先级设置是为了使if .. else不适用于整个key:value对:它只是值的一部分。这意味着您想要:

{str(x): (x if x % 2 else x*10 for x in range(10))}

如果您想进行不同的密钥计算,以及在某些情况下进行不同的值计算,那么您需要像这样操作:

{(str(x) if x % 2 else repr(x)) : x if x % 2 else x * 10 }

这将相当于:

dict([(str(x),x) if x % 2 else (repr(x),x*10) for x in range(10)])

或者你可以决定使用显式循环而不是一行代码来处理如此复杂的问题,这样更易读。


1

看起来只是正确地分组表达式的问题:

# original
{str(x): (x if x % 2 else x*10) for x in range(10)}

# slightly more complex, allowing both key and value to have the ternary
{(str(x) if x % 3 else str(x+1)) : (x if x % 2 else x*10) for x in range(10)}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接