Python 将作者姓名与用逗号分隔的第一个作者姓名和用“QUOTE”分隔的最后一个作者姓名连接起来;及;

Python 将作者姓名与用逗号分隔的第一个作者姓名和用“QUOTE”分隔的最后一个作者姓名连接起来;及;,python,join,Python,Join,我对Python完全陌生,有一个名称列表,用\和分隔,我需要将它们连接起来,用逗号分隔第一个名称,用“and”分隔最后一个名称。但是,如果有4个以上的名称,则返回值应为第一个名称以及短语“et al.”。所以如果我有 authors = 'John Bar \and Tom Foo \and Sam Foobar \and Ron Barfoo' 我应该得到“John Bar等人”。鉴于 authors = 'John Bar \and Tom Foo \and Sam Foobar' 我

我对Python完全陌生,有一个名称列表,用
\和
分隔,我需要将它们连接起来,用逗号分隔第一个名称,用“and”分隔最后一个名称。但是,如果有4个以上的名称,则返回值应为第一个名称以及短语“et al.”。所以如果我有

 authors = 'John Bar \and Tom Foo \and Sam Foobar \and Ron Barfoo'
我应该得到“John Bar等人”。鉴于

authors = 'John Bar \and Tom Foo \and Sam Foobar'
我应该得到“约翰·巴尔、汤姆·福和山姆·福巴尔”

它还应该只使用一个作者的名字,自己返回这个名字(和姓氏)

我试着做一些类似的事情

  names = authors.split('\and')
  result = ', '.join(names[:-1]) + ' and '.join(names[-1])

但这显然不起作用。因此,我的问题是如何使用
join
split
将第一个作者以逗号分隔,最后一个作者以“和”分隔,同时考虑到如果有四个以上的作者,则只应将第一个作者的姓名与“et al”一起返回。

首先,您应该拆分字符串,使用
split
获取名称

parts = author.split(' \and ')
然后应用您的条件:

  • 如果有4个或更多名称,请返回第一个名称+“el at”

    if len(parts) >= 4:
        return parts[0]+' et al'
    
  • 如果有1个以上的名称,请使用“,”将其连接起来,最后一个名称使用“和”

    elif len(parts) > 1:
        return ' and '.join([', '.join(parts[:-1]), parts[-1]])
    
  • 如果只有一个名称,请返回该名称

    return parts[0] 
    
  • 最后一项职能:

    def my_func(author):
        parts = author.split(' \and ')
        if len(parts) >= 4:
            return parts[0]+' et al'
        elif len(parts) > 1:
            return ' and '.join([', '.join(parts[:-1]), parts[-1]])
        return parts[0] 
    
    def reformat_authors(authors):
        names = [name.strip() for name in authors.split(r'\and')]
        if len(names) >= 4:
            return '{} et al.'.format(names[0])
        if len(names) > 1:
            return '{} and {}'.format(', '.join(names[:-1]), names[-1])
        return names[0]
    

    看起来您应该签出
    string.split
    方法。这里有几个例子:要么只有一个名字,要么有2-3个名字,要么有4个以上的名字。每种情况都需要单独处理,因此只需找出在每种情况下需要执行的操作:

    # First split up the names by your specified delimiter (and strip off whitespace)
    names = [name.strip() for name in authors.split(r'\and')]
    
    # Now deal with your three cases for formatting.
    if len(names) == 1:
        print names[0]
    elif len(names) < 4:
        print ', '.join(names[:-1])+' and '+names[-1]
    else:
        print names[0]+' et al.'
    
    #首先用指定的分隔符分隔名称(并去掉空白)
    names=[authors.split(r'\and')中名称的name.strip()
    #现在处理三个格式化案例。
    如果len(name)==1:
    打印姓名[0]
    elif len(姓名)<4:
    打印“,”。连接(名称[:-1])+”和“+名称[-1]
    其他:
    打印名称[0]+“等”
    
    让我们将这些问题分成几个部分:

    首先,获取单个作者的列表:

    >>> authors = 'John Bar \\and Tom Foo \\and Sam Foobar \\and Ron Barfoo'
    >>> authorlist = [item.strip() for item in authors.split("\\and")]
    >>> authorlist
    ['John Bar', 'Tom Foo', 'Sam Foobar', 'Ron Barfoo']
    
    现在检查列表中的条目数,并采取相应措施:

    >>> if len(authorlist) > 3:
    ...     print("{0} et al.".format(authorlist[0]))
    ... elif len(authorlist) == 1:
    ...     print(authorlist[0])
    ... else:
    ...     print("{0} and {1}".format(", ".join(authorlist[:-1]), authorlist[-1]))
    ...
    John Bar et al.
    

    首先将名称分开:

    names = [name.strip() for name in authors.split(r'\and')]  # assuming a raw \ here, not the escape code \a.
    
    然后根据长度重新连接:

    if len(names) >= 4:
        authors = '{} et al.'.format(names[0])
    elif len(names) > 1:
        authors = '{} and {}'.format(', '.join(names[:-1]), names[-1])
    else:
        authors = names[0]
    
    这也适用于只有一位作者的作品;我们只是将名称重新分配给
    作者

    组合成一个函数:

    def my_func(author):
        parts = author.split(' \and ')
        if len(parts) >= 4:
            return parts[0]+' et al'
        elif len(parts) > 1:
            return ' and '.join([', '.join(parts[:-1]), parts[-1]])
        return parts[0] 
    
    def reformat_authors(authors):
        names = [name.strip() for name in authors.split(r'\and')]
        if len(names) >= 4:
            return '{} et al.'.format(names[0])
        if len(names) > 1:
            return '{} and {}'.format(', '.join(names[:-1]), names[-1])
        return names[0]
    
    通过演示:

    >>> reformat_authors(r'John Bar \and Tom Foo \and Sam Foobar \and Ron Barfoo')
    'John Bar et al.'
    >>> reformat_authors(r'John Bar \and Tom Foo \and Sam Foobar')
    'John Bar, Tom Foo and Sam Foobar'
    >>> reformat_authors(r'John Bar \and Tom Foo')
    'John Bar and Tom Foo'
    >>> reformat_authors(r'John Bar')
    'John Bar'
    

    你的问题是什么?看看str.split()方法:你确定
    “\和”
    ?它应该是
    r'\和'
    '\\和'
    。你应该告诉更多关于你是如何尝试解决这个问题的(代码,基本算法),这样可以集中帮助,而不是为你做工作。作者。拆分('\and')是一个很好的开始删除的地方,结果我和cmd有同样的反对意见,但是现在,如果只有一个作者,您的解决方案将返回
    '和John Bar'
    。对于只有一个作者的条目,这将返回'and John Bar'。编辑哦,你刚刚修好了;nevermind:-)不错,虽然对两个固定大小的列表使用
    join()
    是一种bt过度杀伤力,你不觉得吗?@TimPietzcker:这是一种我认为更好的
    过滤器(bool,…)
    方法的保留。@MartijnPieters感谢你的帮助。然而,我不明白为什么我得到了和答案一样多的反对票。即使在我编辑了我的问题之后,我还是得到了新的反对票。我猜人们是这样投票的,因为你自己没有表现出任何研究成果。您基本上要求人们为您编写代码。不过我只能猜测动机。@PiotrHajduga:哎呀!谢谢你发现这个。