繁体   English   中英

列表理解:带条件的双循环

[英]List comprehension : Double loop WITH conditions

几天以来,我尝试在 Python 3 中的列表理解方面训练自己,但我遇到了问题。 我在其他主题中看到了双循环语法,但在第二个循环中从来没有条件。

所以,我不得不说我是否可以在样本值和最大容量中收取一个样本。

我有一个字典样本,其中包含样本的 id 及其 A/B/C 值。 我有一个 dict最大值,我可以充电的最大容量。 还有一个samples_to_check列表,其中包含我必须返回答案的样本。

samples_to_check = [0, 1, 2]

samples = {0: {"A": 2, "B": 0, "C": 3},
           1: {"A": 1, "B": 1, "C": 2},
           2: {"A": 0, "B": 0, "C": 5},
           3: {"A": 0, "B": 0, "C": 2}}

maximum = {"A": 2, "B": 2, "C": 2}

在这个例子中,我们只能对样品 1 收费,因为 A,B 和 C <= 2 我成功地用这个解决方案解决了它:

result2 = [
    "CHARGE " + str(sample_id) for sample_id in samples_to_check
    if maximum["A"] - samples[sample_id]["A"] >= 0 and maximum["B"] - samples[sample_id]["B"] >= 0 and maximum["C"] - samples[sample_id]["C"] >= 0
]

print(result2)
['CHARGE 1']

但我想知道是否可以在不为每个字母重复相同条件的情况下找到最佳解决方案。

我试过这个,但它不起作用。

result = [
    "CHARGE " + str(sample_id) for sample_id in samples_to_check
    for letter in ["A", "B", "C"] if maximum[letter] - samples[sample_id][letter] >= 0
]

print(result)
['CHARGE 0', 'CHARGE 0', 'CHARGE 1', 'CHARGE 1', 'CHARGE 1', 'CHARGE 2', 'CHARGE 2']

谢谢。

您可以使用所有/任何 function 来检查所有字母的此条件:

["charge {}".format(sample_id) for sample_id in samples_to_check if 
 all(maximum[key] - val >= 0  for key, val in samples[sample_id].items())]

但它的可读性不如我推荐的普通 for 循环。

for sample_id in samples_to_check:
    if all(maximum[key] - val >= 0  for key, val in samples[sample_id].items()):
        print('sample_id:', sample_id)

与@Relandom 非常相似,但格式略有不同。 我认为列表推导比常规的 for 循环更简洁,并且创建了更多的 Python 代码。

在这种情况下,我不是循环遍历samples_to_check ,而是遍历主要数据,然后检查 sample_id是否需要检查,这对我来说更有意义。

[
    f"CHARGE {sample_id}"
    for sample_id, sample in samples.items()
    if (
        sample_id in samples_to_check
        and all(maximum[key] >= val for key, val in sample.items())
    )
]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM