列表理解:带条件的双循环
List comprehension : Double loop WITH conditions
自从 Python 3 中的列表理解有几天以来,我一直在尝试训练自己,但我遇到了问题。
我在其他主题中看到了双循环语法,但在第二个循环中没有条件。
所以,我不得不说我能不能在样品值和最大容量中充电样品。
我有一个字典 samples,其中包含样本 ID 及其 A/B/C 值。
我有一个 dict maximum 谁是我可以充电的最大容量。
还有一个 samples_to_check 列表,其中包含我必须 return 回答的示例。
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']
谢谢。
您可以使用 all/any 函数来检查所有字母的条件:
["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 循环更简洁,并且创建更多的 pythonic 代码。
在这里,我不是循环遍历 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())
)
]
自从 Python 3 中的列表理解有几天以来,我一直在尝试训练自己,但我遇到了问题。 我在其他主题中看到了双循环语法,但在第二个循环中没有条件。
所以,我不得不说我能不能在样品值和最大容量中充电样品。
我有一个字典 samples,其中包含样本 ID 及其 A/B/C 值。 我有一个 dict maximum 谁是我可以充电的最大容量。 还有一个 samples_to_check 列表,其中包含我必须 return 回答的示例。
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']
谢谢。
您可以使用 all/any 函数来检查所有字母的条件:
["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 循环更简洁,并且创建更多的 pythonic 代码。
在这里,我不是循环遍历 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())
)
]