0

以下にこの変数があるとします( 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

これらすべてを隣り合わせにしたくないので、各変数の間に24571 つの空白 () が必要です。結果は次のようになります。' '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 の間にあり、スペースが 2 つではなく 1 つだけ必要です。または、結果を次のように表示したいです。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

うまくいけば、私は誰も混乱させません〜、ありがとう:-)

4

2 に答える 2

5

手動で連結する代わりに使用する理由の 1 つは、joinより複雑なことをより簡単に実行できることです。

まず、 を に変えるa + ' ' + b + ' ' + c + ' ' + djoin:

' '.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())

ジェネレーター式を理解していなくても、次のすべてはほぼ同等です。うまくいけば、1 つを理解できるでしょう。

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
于 2013-01-17T20:44:26.310 に答える
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)
于 2013-01-17T20:40:00.623 に答える