我有一套包含所有我想打印出来的项目。但是,输出应该根据集合中的其他内容而有所不同。举个例子:
for i in set(range(10))-{a*b for a in range(2,5)for b in range(2,4)}:
print i if i-1 not in set(range(10))-{a*b for a in range(2,5)for b in range(2,4)}and i+1 not in set(range(10))-{a*b for a in range(2,5)for b in range(2,4)}else `i`+"!"
#For readability purposes, here is the unshortened code
originalNumbers = set(range(10))
numbersToRemove = set([a*b for a in range(2,5) for b in range(2,4)])
finalList = originalNumbers - numbersToRemove
for number in finalList:
if number - 1 in finalList or number + 1 in finalList:
print str(number) + "!"
else:
print number
输出为:
0!
1!
2!
3!
5
7
这是正确的。有没有一种更简单的方法可以做到这一点,而不必再次复制原始集,并且仍然维护可以用一行/语句编写的代码
注意: 集合不必是我指定的集合,我只是用它作为例子
您可以将
set
off的一个副本保存在循环外的一个命名变量中,然后稍后使用保存的set
由于您的目标似乎是一行代码,您必须滥用列表理解/生成器表达式来实现这一点。实现这一点的“好”方法是,第一个循环是单个元素
tuple
上的一个循环,该元素包含您要预计算的值,允许您存储并使用它,而无需添加行。对于您的特定示例,可以这样做:很难看,但是你在写一行代码和打高尔夫,所以难看是不可避免的。它可以进一步缩短(例如,
i-1 not in s and i+1 not in s
可以通过反转if
和else
案例并测试{i-1, i+1} & s
来表示),但是这个版本与示例代码非常接近,可以识别相关问题 更多 >
编程相关推荐