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

时间:2013-01-17 20:34:58

标签: 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

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

total = a + ' ' + b + ' ' + c + ' ' + d

由于我不希望所有这些都彼此相邻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

我的问题是..例如@ 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

希望我不要混淆任何人〜,谢谢: - )

2 个答案:

答案 0 :(得分:4)

使用join而不是手动连接事物的原因之一是,您可以更轻松地执行更复杂的操作。

首先,如果您将a + ' ' + b + ' ' + c + ' ' + d变成join

' '.join((a, b, c, d))

这还没有改变任何东西。

2 4 5 7
4 5   9
  1   2

但现在,我们怎么说“(a, b, c, d)”中的所有非空字符串?易:

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

所以:

2 4 5 7
4 5 9
1 2

就是这样。

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

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

如果您不理解生成器表达式,以下所有内容大致相同,希望您能理解:

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)

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

如果我们坚持你的显式连接,这仍然是可能的,它只是更难和更丑:

((a + ' ') if a else '' +
 (b + ' ') if b else '' +
 (c + ' ') if c else '' +
  d if d else '')

再次给你:

2 4 5 7
4 5 9
1 2

答案 1 :(得分:1)

假设您的表数据位于listtuple,其中每行的id值都是第一列,而行中给定列的值为None是空的:

totals = [' '.join(value for value in row[1:] if value is not None) for row in data]

或者,您可以将其放在dict中,这可能会更有用,具体取决于您以后如何使用它。

data = {'x' : {'values' : (2, 4, 5, 7)},
        'y' : {'values' : (4, 5, None, 9)},
        'z' : {'values' : (None, 1, None, 2)}}
for data_set in data.values():
    data_set['total'] = ' '.join(value for value in data_set['values'] if value is not None)