如何在python中同时连接和压缩字符串变量?

JPC*_*JPC 0 python string formatting concatenation

假设我在下面有这个变量( id , a,b,c,d )

id  a b c d
x   2 4 5 7
y   4 5   9
z     1   2
Run Code Online (Sandbox Code Playgroud)

我想从这些字符串创建一个名为“total”的新连接变量,所以我使用了下面的代码:

total = a + ' ' + b + ' ' + c + ' ' + d
Run Code Online (Sandbox Code Playgroud)

由于我不希望所有这些彼此相邻2457,我需要' '在每个变量之间留一个空格 ( ) 2 4 5 7,我的结果看起来像这样

id  a b c d        total
x   2 4 5 7       2 4 5 7
y   4 5   9       4 5   9
z     1   2         1   2
Run Code Online (Sandbox Code Playgroud)

我的问题是 .. 例如 @y 介于 5 和 9 之间,我只想要一个空格而不是两个 或者我希望我的结果看起来像这样......谁能告诉我如何做到这一点?在 SAS 中,我可以轻松地使用某些东西进行压缩,但不确定如何在 python 中执行此操作。

id  a b c d        total
x   2 4 5 7       2 4 5 7
y   4 5   9       4 5 9
z     1   2       1 2
Run Code Online (Sandbox Code Playgroud)

希望我不会让任何人感到困惑〜,谢谢:-)

aba*_*ert 5

使用join而不是手动连接事物的原因之一是您可以更轻松地完成更复杂的事情。

首先,如果你把你的a + ' ' + b + ' ' + c + ' ' + d变成一个join

' '.join((a, b, c, d))
Run Code Online (Sandbox Code Playgroud)

这还没有改变任何事情。

2 4 5 7
4 5   9
  1   2
Run Code Online (Sandbox Code Playgroud)

但是现在,我们如何说“”中的所有非空字符串(a, b, c, d)?简单:

' '.join(x for x in (a, b, c, d) if x)
Run Code Online (Sandbox Code Playgroud)

所以:

2 4 5 7
4 5 9
1 2
Run Code Online (Sandbox Code Playgroud)

就是这样。

如果空值不是空字符串(或None),而是例如 ,则' '需要更改测试。例如,也许:

' '.join(x for x in (a, b, c, d) if x.strip())
Run Code Online (Sandbox Code Playgroud)

如果您不理解生成器表达式,以下所有内容大致等效,希望您能理解其中之一:

total = ' '.join(x for x in (a, b, c, d) if x)

total = ' '.join([x for x in (a, b, c, d) if x])

total = ' '.join(filter(bool, (a, b, c, d))

non_zero_values = []
for x in (a, b, c, d):
    if x:
        non_zero_values.append(x)
total = ' '.join(non_zero_values)
Run Code Online (Sandbox Code Playgroud)

在每种情况下,想法都是一样的:我们有一个 4 个值的序列,我们通过只保留非空的值将其过滤为 0 到 4 个值的序列。

如果我们坚持你的明确串联,这仍然是可能的,只是更难更丑:

((a + ' ') if a else '' +
 (b + ' ') if b else '' +
 (c + ' ') if c else '' +
  d if d else '')
Run Code Online (Sandbox Code Playgroud)

这再次给你:

2 4 5 7
4 5 9
1 2
Run Code Online (Sandbox Code Playgroud)