代码缩短成员签入

2024-10-01 09:40:51 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一套包含所有我想打印出来的项目。但是,输出应该根据集合中的其他内容而有所不同。举个例子:

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

这是正确的。有没有一种更简单的方法可以做到这一点,而不必再次复制原始集,并且仍然维护可以用一行/语句编写的代码

注意: 集合不必是我指定的集合,我只是用它作为例子


Tags: 项目innumber内容forifnotrange
1条回答
网友
1楼 · 发布于 2024-10-01 09:40:51

您可以将setoff的一个副本保存在循环外的一个命名变量中,然后稍后使用保存的set

由于您的目标似乎是一行代码,您必须滥用列表理解/生成器表达式来实现这一点。实现这一点的“好”方法是,第一个循环是单个元素tuple上的一个循环,该元素包含您要预计算的值,允许您存储并使用它,而无需添加行。对于您的特定示例,可以这样做:

print '\n'.join(str(i) if i-1 not in s and i+1 not in s else str(i)+'!' for s in (set(range(10)) - {a*b for a in range(2,5) for b in range(2,4)},) for i in s)

很难看,但是你在写一行代码和打高尔夫,所以难看是不可避免的。它可以进一步缩短(例如,i-1 not in s and i+1 not in s可以通过反转ifelse案例并测试{i-1, i+1} & s来表示),但是这个版本与示例代码非常接近,可以识别

相关问题 更多 >