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))