Python 对集合执行Pop、Discard和Remove命令
如果有人能帮助理解以下评估逻辑以及特定方法在该场景中的应用Python 对集合执行Pop、Discard和Remove命令,python,Python,如果有人能帮助理解以下评估逻辑以及特定方法在该场景中的应用 n = int(input()) s = set(map(int, input().split())) for i in range(int(input())): eval('s.{0}({1})'.format(*input().split()+[''])) print(sum(s)) 上面的代码工作得非常好,我试图详细了解函数的工作原理 是指问题所在 欢迎来到stackoverflow。如果您是Python初学者,我
n = int(input())
s = set(map(int, input().split()))
for i in range(int(input())):
eval('s.{0}({1})'.format(*input().split()+['']))
print(sum(s))
上面的代码工作得非常好,我试图详细了解函数的工作原理
是指问题所在
欢迎来到stackoverflow。如果您是Python初学者,我建议您阅读,它们为理解Python提供了很好的资源 对于这个问题,您需要阅读 好的,让我们把代码一行一行地分解
n = int(input())
从stdin获取一个输入字符串,然后将其转换为int
数据类型。然后将其存储到变量n
s = set(map(int, input().split()))
获取一个输入,并在每个空格上拆分它。e、 g如果输入是1 2 3
,它将是[1,2,3]
的列表。然后,将列表中的每个元素转换为int数据类型。然后,将列表转换为set。然后将其存储到变量s
for i in range(int(input())):
从0迭代到输入中的字符串,并转换为int数据类型,如i
eval('s.{0}({1})'.format(*input().split()+['']))
好吧,这会有点棘手
首先,尝试理解Python格式,我建议您阅读。简而言之,“string{0},{2},{1}”。格式(“a”,“b”,“c”)
将为您提供字符串“string a,c,b”
在本例中,格式将采用2个参数,因为字符串's.{0}({1})
中有{0}
和{1}
,该字符串来自*input().split()+['']
语句
Python将执行input().split()
首先,获取一个输入并将其拆分为一个列表。然后将该列表与另一个列表合并,即['']
。然后,将列表元素作为格式的参数展开
e、 g
如果你有输入
remove 9
它将调用这样的格式
's.{0}({1})'.format("remove", "9", "")
# will be
's.remove(9)'
好的,但是+['']
是干什么的?对于只有一个单词的输入,这是格式化程序的一个技巧
e、 g
Eval函数接受一个参数,即字符串。它将以Python代码的形式执行字符串。因此,eval(“打印(1)”)
将1
打印到控制台
print(sum(s))
打印集合s
我希望我解释得足够清楚谢谢@Andra,这也是一个非常好的替代解决方案:
n = int(input())
s = set(map(int, input().split()))
d = {"pop":s.pop, "remove":s.remove, "discard": s.discard}
for _ in range(int(input())):
c = input().split()
d[c[0]](int(c[1])) if len(c)>1 else d[c[0]]()
print(sum(s))
很好地使用dict将命令映射到函数。但是如果len(c)>1else(d[c[0]])这一行
d[c[0]](int(c[1])()
很难解开。尝试使用一些中间变量。这将需要多行代码,但将所有代码塞进一行并不总是有帮助的。类似于fn=d.get(c[0]);if fn不是None:if len(c)>1:fn(int(c[1])else:fn()
(unf.我不能在注释中格式化多行,但这些行应该是单独的行)。如果fn不是None,则测试将防止输入除预期的pop/remove/discard之外的单词。额外积分:您将如何添加对向s添加元素的支持?谢谢@PaulMcG,我将试一试,您认为第一个解决方案可能会比顶部的解决方案更有效吗?eval()
是初学者常用的功能,但是如果在生产应用程序中使用,它会有严重的安全问题,因此我建议不要使用它。您使用的方法与更高级的用户使用的方法更相似。但是您应该认真研究这一行,真正了解每一行的功能。^如果我是wro,请纠正我但是它是这样工作的:if len(c)>1:d[c[0]](int(c[1])else:d[c[0]()
print(sum(s))
n = int(input())
s = set(map(int, input().split()))
d = {"pop":s.pop, "remove":s.remove, "discard": s.discard}
for _ in range(int(input())):
c = input().split()
d[c[0]](int(c[1])) if len(c)>1 else d[c[0]]()
print(sum(s))