(抱歉,无法抵制这个双关语!)
我想知道为什么似乎不能翻译:
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 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)}
{ str(x):(x if x % 2 else x*10) for x in range(10) }
看起来运作良好。
{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优先级设置是为了使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)])
或者你可以决定使用显式循环而不是一行代码来处理如此复杂的问题,这样更易读。
看起来只是正确地分组表达式的问题:
# 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)}
dict((str(x),x if i%2 else x*10) for x in range(10))
以与thg435的解决方案对称。(我还将列表推导式更改为生成器,因为...为什么不呢?) - mgilson