【问题标题】:How does Python's .join work?Python 的 .join 是如何工作的?
【发布时间】:2016-06-17 07:12:01
【问题描述】:

有人建议我使用以下解决方案,但我不理解以下代码的这一行 cmd += "("+ ",".join(args) +")"。 我为此感到沮丧。有人可以帮助我吗

问题是读取这样的输入

12
insert 0 5
insert 1 10
insert 0 6
print 
remove 6
append 9
append 1
sort 
print
pop
reverse
print

我对 Python 语言的尝试

n = input()
l = []
for _ in range(n):
    s = raw_input().split()
    cmd = s[0]
    args = s[1:]
    if cmd !="print":
        cmd += "("+ ",".join(args) +")"
        eval("l."+cmd)
    else:
        print l

【问题讨论】:

  • 你自己明白",".join(args)吗...?
  • 你想归档什么?
  • 不,我不明白 .deceze
  • Rahul 我只是想了解这一行 cmd += "("+ ",".join(args) +")"
  • eval() 是一个糟糕的解决方案。见stackoverflow.com/questions/1832940/…。例如,在这种特殊情况下,您可以使用 getattr(l, cmd)(*(int(arg) for arg in args))。即使是不受控制的 getattr 也可能是邪恶的。

标签: python


【解决方案1】:

这一行是为了确保您的命令语法正确,并且在您调用它时有括号和逗号!我在下面的代码中写得更清楚了:

cmd = 'insert'
arg1 = '1'
arg2 = '3'
arg3 = '10'

cmd = cmd + "(" + ",".join((arg1, arg2, arg3)) + ")"
print cmd

输出:

insert(1,3,10)

【讨论】:

  • "," 只是参数的分隔符我们可以使用任何东西来代替 ,比如 / 。
【解决方案2】:

考虑以下输入行:

insert 1 10

所以s 是列表["insert", "1", "10"]。请注意,列表元素都是字符串。

所以cmd"insert"args["1", "10"]

现在是您不理解的部分。首先,",".join(args) 只是创建一个由arg 的元素组成的字符串,用逗号分隔:"1,10"

然后用括号括起来:"(1,10)"。最后,它被附加到cmd 上,得到字符串"insert(1,10)"

然后将"l." 添加到此字符串之前,从而生成字符串"l.insert(1,10)"。然后将其传递给eval

所以它调用列表l 上的insert 方法,将值10 插入位置1。即,它正在执行l.insert(1,10)

【讨论】:

  • 非常感谢汤姆。完全明白了:)
【解决方案3】:

你的问题是下面这行是什么意思:

cmd += "("+ ",".join(args) +")"

cmd 是一个变量(带有字符串)。

+= 是一个将右侧添加到左侧的运算符。

"(" 是一个包含左括号的字符串。

+ 是一个将自身左右相加的运算符。

",".join(args) 这使得列表args 变成一个用逗号分隔的字符串。例如:

args =['bob','sue','tom'], then: 
",".join(args)
> bob,sue,tom

同样,+ 是一个将自身左右相加的运算符。

) 是一个包含右括号的字符串。

因此,如果 args 是 ['bob',sue','tom],而 cmd 是名称,那么这一行的输出将是:

cmd = "names"
args =["bob","sue","tom"]
cmd += "("+ ",".join(args) +")"
print cmd
> names(bob,sue,tom)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    相关资源
    最近更新 更多