26

「and」を使用する最後のものを除いて、各項目間にコンマがあるようにリストを結合する最もpythonicな方法は何ですか?

["foo"] --> "foo"
["foo","bar"] --> "foo and bar"
["foo","bar","baz"] --> "foo, bar and baz"
["foo","bar","baz","bah"] --> "foo, bar, baz and bah"
4

6 に答える 6

30

この式はそれを行います:

print ", ".join(data[:-2] + [" and ".join(data[-2:])])

ここに見られるように:

>>> data
    ['foo', 'bar', 'baaz', 'bah']
>>> while data:
...     print ", ".join(data[:-2] + [" and ".join(data[-2:])])
...     data.pop()
...
foo, bar, baaz and bah
foo, bar and baaz
foo and bar
foo
于 2013-11-07T15:06:45.613 に答える
14

これを試してください。エッジケースを考慮して を使用しformat()、別の可能な解決策を示します。

def my_join(lst):
    if not lst:
        return ""
    elif len(lst) == 1:
        return str(lst[0])
    return "{} and {}".format(", ".join(lst[:-1]), lst[-1])

期待どおりに動作します:

 my_join([])
=> ""
 my_join(["x"])
=> "x"
 my_join(["x", "y"])
=> "x and y"
 my_join(["x", "y", "z"])
=> "x, y and z"
于 2013-11-07T15:04:02.260 に答える
1

すでに良い答えがあります。これはすべてのテスト ケースで機能し、他のテスト ケースとは少し異なります。

def grammar_join(words):
    return reduce(lambda x, y: x and x + ' and ' + y or y,
                 (', '.join(words[:-1]), words[-1])) if words else ''

tests = ([], ['a'], ['a', 'b'], ['a', 'b', 'c'])
for test in tests:                                 
    print grammar_join(test)

a
a and b
a, b and c
于 2013-11-07T15:56:57.100 に答える
-1

負のインデックス作成がサポートされていないソリューションが必要な場合 (つまり、Django QuerySet)

def oxford_join(string_list):
    if len(string_list) < 1:
        text = ''
    elif len(string_list) == 1:
        text = string_list[0]
    elif len(string_list) == 2:
        text = ' and '.join(string_list)
    else:
        text = ', '.join(string_list)
        text = '{parts[0]}, and {parts[2]}'.format(parts=text.rpartition(', '))  # oxford comma
    return text

oxford_join(['Apples', 'Oranges', 'Mangoes'])
于 2015-09-22T04:51:22.017 に答える
-1

最後のものを特殊なケースにするだけです。このようなもの:

'%s and %s'%(', '.join(mylist[:-1]),mylist[-1])

おそらく、これ以上簡潔な方法はありません。

これは、ゼロの場合でも失敗します。

于 2013-11-07T14:57:58.230 に答える