在dict理解中使用else

时间:2016-09-05 16:03:24

标签: python dictionary list-comprehension

来自两个词典:

d1 = {a:a for a in 'abcdefg'}
d2 = {n:n for n in range(10)}

我如何创建第三个像:

new_dict = {k:d1[k] if k in d1.keys() else k:d2[k]  for k in 'abc123' }

它抛出了一个语法错误,但是列表理解似乎很好:

[a if a else 2 for a in [0,1,0,3]]
out[]: [2, 1, 2, 3]

此外,为什么会这样:

{k:d1[k]  for k in 'abc123' if k in d1.keys() }

而这不是:

{k:d1[k] if k in d1.keys() for k in 'abc123' }

4 个答案:

答案 0 :(得分:3)

如上所述,您的d1d2似乎都是您设想解决问题并且不是必不可少的工件。简单来说:

>>> dictionary = {k: int(k) if k.isdigit() else k for k in 'abc123'}
>>> dictionary
{'b': 'b', '3': 3, '2': 2, '1': 1, 'a': 'a', 'c': 'c'}
>>> 

或者您尝试解决的问题还有哪些?

答案 1 :(得分:2)

您不能在三元条件的else部分使用键值对,如此。

请改为:

new_dict = {k: d1[k] if k in d1 else d2[int(k)]  for k in 'abc123'}
#                                    ^^<- make value d2[int(k)] on else
print(new_dict)
#{'2': 2, '1': 1, 'b': 'b', 'a': 'a', 'c': 'c', '3': 3}

请注意,if k in d1会检查k是否是字典d1中的密钥。无需调用keys方法。

答案 2 :(得分:2)

这是使用&#34; else&#34;进行字典理解的一般答案。当我搜索谷歌时,我发现了这篇文章,所以我希望它可以帮助未来的谷歌。

所以我想说我想在k和v上创建带有条件的字典

解决这个问题的一种天真的方式看起来像这样:

{k:v if (condition) else otherk:otherv for k,v in some_dictionary}

这不起作用,正如之前摩西科莱约耶所提到的那样。

但是,您可以对每个部分使用以下内容:

{k if condition1 else otherK: v if condition2 else otherV for k,v in some_dictionary}

请注意,我们在此处指定了键的赋值和值的赋值。 这里要注意的最重要的事情是:键和值之间的分隔符的位置。希望这会有所帮助。

以下是从以下位置获取自定义词典的示例: 对于英文字母 来自字母A-G将显示大写字母顺序的正值 来自字母J-Z显示小写字母的顺序的负值

这是基于特定条件的不同键和值的示例。 我希望这个解释得很好。

>>> def less_than_H_ascii_val(x):
...     return x < ord('H')-ord('A')
...
>>> {chr(k+ord('A')) if less_than_H_ascii_val(k) else chr(k+ord('a')):
... k if less_than_H_ascii_val(k) else -k 
... for k in range(26)}
{'A': 0, 'C': 2, 'B': 1, 'E': 4, 'D': 3, 'G': 6, 'F': 5, 'i': -8, 'h': -7, 'k': -10, 'j': -9, 'm': -12, 'l': -11, 'o': -14, 'n': -13, 'q': -16, 'p': -15, 's': -18, 'r': -17, 'u': -20, 't': -19, 'w': -22, 'v': -21, 'y': -24, 'x': -23, 'z': -25}

答案 3 :(得分:0)

purchasetype

等于:

<?php

$PurchaseType = "Cash";
$html = '
<html>
<body>
<label> variable here :  "phpvariable" </label>
</body>
</html>
';

$path = (getenv('MPDF_ROOT')) ? getenv('MPDF_ROOT') : __DIR__;
require_once $path . '/vendor/autoload.php';
$mpdf = new \Mpdf\Mpdf([
    'margin_left' => 20,
    'margin_right' => 15,
    'margin_top' => 48,
    'margin_bottom' => 25,
    'margin_header' => 10,
    'margin_footer' => 10
]);
$mpdf->SetProtection(array('print'));
$mpdf->SetTitle("Acme Trading Co. - Invoice");
$mpdf->SetAuthor("Acme Trading Co.");
$mpdf->SetWatermarkText("Paid");
$mpdf->showWatermarkText = true;
$mpdf->watermark_font = 'DejaVuSansCondensed';
$mpdf->watermarkTextAlpha = 0.1;
$mpdf->WriteHTML($html);
$mpdf->Output();

后者更容易理解