Python 自动化无聊的东西:逗号代码:有没有更有效的方法?

Python 自动化无聊的东西:逗号代码:有没有更有效的方法?,python,Python,这是我的代码,它将接收一个列表并返回一个字符串,该字符串由逗号分隔,最后两个字符串之间用“and”分隔。有更有效的方法吗?您可以先加入,然后用“and”替换逗号的最后一个实例。这足够健壮,可以接受多个分隔符,而不仅仅是逗号 例如: animals = ["rat", "cat", "bat", "mouse", "zebra", "barbeque", "chicke

这是我的代码,它将接收一个列表并返回一个字符串,该字符串由逗号分隔,最后两个字符串之间用“and”分隔。有更有效的方法吗?

您可以先加入,然后用“and”替换逗号的最后一个实例。这足够健壮,可以接受多个分隔符,而不仅仅是逗号

例如:

animals = ["rat", "cat", "bat", "mouse", "zebra", "barbeque", "chicken"]
def joiner(joined):
    while True:
        if len(joined) == 0:
            break
        else:
            lister = ", ".join(joined[:-1])
            lister = lister + " and " + joined[-1]
            print(lister)
            break             

joiner(animals)
        
输出:

animals = ["rat", "cat", "bat", "mouse", "zebra", "barbeque", "chicken"]

def addand(list_to_use, char_to_find):

    base_string = ','.join(list_to_use)
    k = base_string .rfind(char_to_find)
    new_string = animals_string[:k] + " and " + animals_string[k+1:]
    return new_string



 new_string = addand(animals, ',')

一个衬里,用于美化0和1元素的情况:

rat,cat,bat,mouse,zebra,barbeque and chicken

对于长度=0、1和2,可能需要使用特殊情况。但一般情况是:

'sorry, empty list' if len(animals)==0 else animals[0] if len(animals)==1  else ", ".join(animals[:-1]) + " and " + animals[-1] 

我喜欢用逗号。如果没有,请将“
”和“
更改为“
”和“
”,不要麻烦特殊的套管长度==2。

我相信所有现有答案都会从结构上更改OPs代码,如果不是从行为上。我认为,这并不是:

', '.join(x[0:-1]) + ", and " + x[-1]

您的代码在执行的操作方面并不浪费,但如果您想让代码看起来更短,可以这样做:

def joiner_new(joined):
  if len(joined) > 1:
    joined = joined[:-2] + [joined[-2] + " and " + joined[-1]]
  print(", ".join(joined))
joiner_new(animals)

,而True
是完全没有意义的。你说的“高效”是什么意思?但是它更短,因此更高效,这是我一直在寻找的。实际上,这与OP的代码做的事情是不同的。仔细观察……事实上,我看到了两个不同之处。@Haris_Mauler-短代码效率更高并不总是正确的(我并不是说这不是真的),因为,例如,加载和使用外部模块来做某事可能比编写稍长的代码来做同样的事情要短,但后者可能更有效。这显然取决于具体情况。这会在列表中添加一个牛津逗号,即使OP的代码没有。对于len(列表)小于2@Steve. 哎呀,错过了原来的海报,我不想要牛津逗号。Will FixWhen joined=[]?为代码添加一点解释以及为什么您认为这是一个好的解决方案会很有帮助——这被标记为仅作为代码的低质量。
def joiner_new(joined):
  if len(joined) > 1:
    joined = joined[:-2] + [joined[-2] + " and " + joined[-1]]
  print(", ".join(joined))
joiner_new(animals)
animals = ["rat", "cat", "bat", "mouse", "zebra", "barbeque", "chicken"]
def joiner(joined):
    try:
        lister = ', '.join(joined[:-1] + ['and ' + joined[-1]])
        print(lister)
    except IndexError:
        pass