【发布时间】:2021-08-22 09:34:11
【问题描述】:
我尝试在 Python 3 中的列表理解方面训练自己,但我遇到了一个问题。 我在其他主题中看到了双循环语法,但在第二个循环中从来没有条件。
所以,我不得不说,在样本值和最大容量中,我能不能给一个样本充电。
我有一本字典 samples,其中包含样本的 id 及其 A/B/C 值。 我有一个 dict maximum 我可以充电的最大容量。 还有一个 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
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']
谢谢。
【问题讨论】:
-
“正确”的形式是
... if any(maximum[letter] - samples[sample_id][letter] >= 0 for letter in ["A", "B", "C"]]),但坦率地说,两者都不是特别可读。常规的for循环或条件函数可能比将所有内容都塞进一个表达式中更好。
标签: python python-3.x performance optimization list-comprehension