Python-Join-Liste der Strings mit Komma aber mit einigen Bedingungen – Code-Refraktion

Angenommen, ich habe diese Liste l :

 l = ['a', 'b', 'c', 'd', 'e'] 

Ich weiß, ich kann mit ihnen verbinden .join mit Komma getrennt als:

 s = ', '.join(l) >>> a, b, c, d, e 

Aber ich möchte diese Bedingungen beim Beitritt respektieren, nur wenige Fälle sind:

  • Wenn len(l) == 1 dann Ausgang sollte nur a
  • Wenn len(l) == 2 dann Ausgabe sollte a and b
  • Wenn len(l) > 2 and len(l) < 5 dann Ausgang a, b, c and d
  • Wenn len(l) >= 5 :
    • Wenn len(l) == 5 dann Ausgang sollte a, b, c, d and 1 other
    • Wenn len(l) > 5 dann Ausgang sollte a, b, c, d and +(number of remaining strings) others

Was ich versucht habe (arbeiten):

 def display(l, threshold=4): s = '' if l: c = len(l) if c <= threshold: if c == 1: s = l[0] else: s = ', '.join(l[:-1]) s += ' and ' + l[-1] else: s = ', '.join(l[:threshold]) remaining = c - threshold other = 'other' if remaining == 1 else 'others' remaining = str(remaining) if remaining == 1 else '+' + str(remaining) s += ' and %s %s' % (remaining, other) print s return s if __name__ == '__main__': l = ['a', 'b', 'c', 'd', 'e', 'f'] display(l[:1]) display(l[:2]) display(l[:3]) display(l[:4]) display(l[:5]) display(l) 

Ausgabe:

 a a and b a, b and c a, b, c and d a, b, c, d and 1 other a, b, c, d and +2 others 

Kann dieser Code verbessert und refraktor werden?

4 Solutions collect form web for “Python-Join-Liste der Strings mit Komma aber mit einigen Bedingungen – Code-Refraktion”

 def display(l, t = 5): length = len(l) if length <= 2: print " and ".join(l) elif length < threshold: print ", ".join(l[:-1]) + " and " + l[-1] elif length == threshold: print ", ".join(l[:-1]) + " and 1 other" else: print ", ".join(l[:t-1]) + " and +{} others".format(length - (t - 1)) 

Ausgabe

 a a and b a, b and c a, b, c and d a, b, c, d and 1 other a, b, c, d and +2 others 

Das tut genau das, was du wolltest:

 def frmt_lst(l, limit=5): if len(l) == 1: return l[0] if len(l) < limit: return '{} and {}'.format(', '.join(l[:-1]), l[-1]) if len(l) == limit: return '{} and 1 other'.format(', '.join(l[:-1])) if len(l) > limit: return '{} and {} others'.format(', '.join(l[:limit-1]), len(l[limit-1:])) print frmt_lst(['a']) print frmt_lst(['a', 'b']) print frmt_lst(['a', 'b', 'c']) print frmt_lst(['a', 'b', 'c', 'd']) print frmt_lst(['a', 'b', 'c', 'd', 'e']) print frmt_lst(['a', 'b', 'c', 'd', 'e', 'f']) >>> a a and b a, b and c a, b, c and d a, b, c, d and 1 other a, b, c, d and 2 others 

Ich habe bemerkt, dass Sie nur wirklich vier Sonderfälle hatten. Also habe ich den Code einfacher gemacht.

Nur ein Gedanke (vielleicht überkompliziert)

 def join_func(inlist, threshold=5): llen = len(inlist) if llen==1: return inlist[0] suffix_len = llen - threshold prefix = ','.join(inlist[:min(llen, threshold)-1*(suffix_len<=0)]) return ' and '.join([prefix, inlist[-1] if suffix_len<=0 else '{} other{}'.format(suffix_len, 's'*(suffix_len>1))]) 

Einiger Test

 In [69]: for l in xrange(1, 8): print join_func(list(string.ascii_letters[:l])) ....: a a and b a,b and c a,b,c and d a,b,c,d and e a,b,c,d,e and 1 other a,b,c,d,e and 2 others 
 def frm_list(l, limit=5): length = len(l) if length == 1: return l[0] if length > limit: l_joins = ', '.join(l[:limit-1]) others = length - limit plural = others > 1 and 's' or '' return u'{} and {} other{}'.format(l_joins, others, plural) l_joins = ', '.join(l[:-1]) return u'{} and {}'.format(l_joins, l[-1]) 
  • Strings in hebräisch in python für s60
  • Python - Konvertieren von String in Integer für Randeingaben
  • Python: Druck eine Variable in Hex
  • Python string formatierung feste breite
  • Wie kann ich einen String in eine Liste aufteilen?
  • Aufteilen einer Zeichenfolge mit wiederholten Zeichen in eine Liste mit Regex
  • Ein Programm, das einzelne Wörter in einem Satz identifiziert, diese in einer Liste speichert und jedes Wort durch die Position dieses Wortes in der Liste ersetzt
  • Entfernen Sie leere Zeichenfolgen aus einer Liste von Zeichenfolgen
  • Biographische Daten in der Reihenfolge von 4 Parametern unter Verwendung von Python 3.3
  • Füllen numpy Array mit [:,:] stürzt Python?
  • Gib alle möglichen Kombinationen eines Strings zurück, wenn er in n Strings aufgeteilt ist
  • Python ist die beste Programmiersprache der Welt.