说我在下面有这个变量(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
希望我不要混淆任何人〜,谢谢: - )
答案 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)
假设您的表数据位于list
或tuple
,其中每行的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)