我想要列表的语法上正确的,人类可读的字符串表示形式。例如,列表['A', 2, None, 'B,B', 'C,C,C']
应该返回字符串A, 2, None, B,B, and C,C,C
。这个人为的例子有些必要。请注意,Oxford comma与该问题有关。
我尝试了', '.join(seq)
,但这不能产生上述示例的预期结果。
请注意先前存在的类似问题:
答案 0 :(得分:2)
此功能有效。它处理小列表与大列表的方式不同。
from typing import Any, List
def readable_list(seq: List[Any]) -> str:
seq = [str(s) for s in seq]
if len(seq) < 3:
return ' and '.join(seq)
return ', '.join(seq[:-1]) + ', and ' + seq[-1]
用法示例:
readable_list([])
''
readable_list(['A'])
'A'
readable_list(['A', 2])
'A and 2'
readable_list(['A', None, 'C'])
'A, None, and C'
readable_list(['A', 'B,B', 'C,C,C'])
'A, B,B, and C,C,C'
readable_list(['A', 'B', 'C', 'D'])
'A, B, C, and D'
答案 1 :(得分:0)
您还可以将包装用于稍微清洁的解决方案:
def readable_list(_s):
if len(_s) < 3:
return ' and '.join(map(str, _s))
*a, b = _s
return f"{', '.join(map(str, a))}, and {b}"
vals = [[], ['A'], ['A', 2], ['A', None, 'C'], ['A', 'B,B', 'C,C,C'], ['A', 'B', 'C', 'D']]
print([readable_list(i) for i in vals])
输出:
['', 'A', 'A and 2', 'A, None, and C', 'A, B,B, and C,C,C', 'A, B, C, and D']
答案 2 :(得分:0)
我真的很固执,我真的很想找出一种解决方案。
"{} and {}".format(seq[0], seq[1]) if len(seq)==2 else ', '.join([str(x) if (y < len(seq)-1 or len(seq)<=1) else "and {}".format(str(x)) for x, y in zip(seq, range(len(seq)))])
编辑
我认为这可以解决问题。而且我认为这个问题还比我认为用一个不丑陋的单线解决方案更复杂。
答案 3 :(得分:0)
基于accepted answer和thread you linked to,这是一个单行代码,其中包含一个可选参数,用于确定是否使用牛津逗号。
from typing import List
def list_items_in_english(l: List[str], oxford_comma: bool = True) -> str:
"""
Produce a list of the items formatted as they would be in an English sentence.
So one item returns just the item, passing two items returns "item1 and item2" and
three returns "item1, item2, and item3" with an optional Oxford comma.
"""
return ", ".join(l[:-2] + [((oxford_comma and len(l) != 2) * ',' + " and ").join(l[-2:])])