Πώς θα κάνετε μια διαχωρισμένη με κόμματα κορδόνι από μια λίστα των χορδών;

ψήφοι
313

Τι θα ήταν προτιμότερος τρόπος για να ενώσετε χορδές από μια ακολουθία τέτοια ώστε μεταξύ κάθε δύο διαδοχικών ζευγών προστίθεται ένα κόμμα. Δηλαδή, πώς χάρτη, για παράδειγμα, [ 'a', 'b', 'c' ]να 'a,b,c'; (Οι περιπτώσεις [ s ]και []θα πρέπει να αντιστοιχίζονται με sκαι '', αντίστοιχα.)

Συνήθως καταλήξετε με κάτι σαν ''.join(map(lambda x: x+',',l))[:-1], αλλά και αισθάνεται κάπως ανικανοποίητο.

Επεξεργασία: Είμαι τόσο ντροπιασμένος και χαρούμενος ότι η λύση είναι τόσο απλή. Προφανώς έχω σχεδόν μια ιδέα για το τι κάνω. (Μάλλον χρειάζεται «απλή» συνένωση κατά το παρελθόν και με κάποιο τρόπο στη μνήμη s.join([e1,e2,...])ως συντομογραφία για s+e1+e2+....)

Δημοσιεύθηκε 04/09/2008 στις 20:04
πηγή χρήστη
Σε άλλες γλώσσες...                            


15 απαντήσεις

ψήφοι
593

myList = ['a','b','c','d']
myString = ",".join(myList )

Αυτό δεν θα λειτουργήσει αν η λίστα περιέχει τους αριθμούς.


Όπως Ρικάρντο Ρέγιες πρότεινε, εάν περιέχει τύπους μη-string (όπως ακέραιοι, πλωτήρες, bools, None) και στη συνέχεια κάνετε:

myList = ','.join(map(str, myList)) 
Απαντήθηκε 04/09/2008 στις 20:06
πηγή χρήστη

ψήφοι
58

Γιατί η μαγεία χάρτη / λ; Δεν το έργο αυτό;

>>>foo = [ 'a', 'b', 'c' ]
>>>print ",".join(foo)
a,b,c
>>>print ",".join([])

>>>print ",".join(['a'])
a

Επεξεργασία: @ σήμα-BIEK επισημαίνει την υπόθεση για τους αριθμούς. Ίσως η κατανόηση λίστα:

>>>','.join([str(x) for x in foo])

είναι πιο «pythonic».

Edit2: Ευχαριστώ για τις προτάσεις. Θα χρησιμοποιήσει τη γεννήτρια και όχι τη λίστα κατανόηση στο μέλλον.

>>>','.join(str(x) for x in foo)
Απαντήθηκε 04/09/2008 στις 20:08
πηγή χρήστη

ψήφοι
11

Μην απλά θέλετε:

",".join(l)

Προφανώς αυτό γίνεται πιο περίπλοκη, αν πρέπει να αναφέρω / ξεφύγουν κόμματα κλπ στις τιμές. Σε αυτή την περίπτωση θα ήθελα να προτείνω κοιτάζοντας την ενότητα csv στο πρότυπο βιβλιοθήκης:

https://docs.python.org/library/csv.html

Απαντήθηκε 04/09/2008 στις 20:09
πηγή χρήστη

ψήφοι
1

Εκτός αν είμαι λείπει κάτι, ','.join(foo)θα πρέπει να κάνουμε ό, τι ζητάτε.

>>> ','.join([''])
''
>>> ','.join(['s'])
's'
>>> ','.join(['a','b','c'])
'a,b,c'

(Edit: και ως jmanning2k επισημαίνει,

','.join([str(x) for x in foo])

είναι ασφαλέστερο και πολύ Pythonic, αν και η προκύπτουσα χορδή θα είναι δύσκολο να αναλύσει εάν τα στοιχεία που μπορεί να περιέχει κόμμα - σε εκείνο το σημείο, θα πρέπει να έχετε την πλήρη ισχύ του csv. ενότητα, όπως Ντάγκλας επισημαίνει στην απάντησή του)

Απαντήθηκε 04/09/2008 στις 20:10
πηγή χρήστη

ψήφοι
4

@ Jmanning2k χρησιμοποιώντας μια λίστα κατανόηση έχει το μειονέκτημα της δημιουργίας ενός νέου προσωρινό κατάλογο. Η καλύτερη λύση θα πρέπει να χρησιμοποιούν itertools.imap το οποίο επιστρέφει ένα iterator

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))
Απαντήθηκε 04/09/2008 στις 20:57
πηγή χρήστη

ψήφοι
9

@Peter Hoffmann

Χρησιμοποιώντας εκφράσεις γεννήτρια έχει το πλεονέκτημα να παράγει ένα iterator, αλλά εξοικονομεί itertools εισαγωγής. Επιπλέον, η λίστα Η κατανόηση είναι γενικά προτίμησε να χαρτογραφήσει, έτσι, θα ήθελα να περιμένω εκφράσεις της γεννήτριας πρέπει να προτιμώνται σε IMAP.

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 
Απαντήθηκε 05/09/2008 στις 15:29
πηγή χρήστη

ψήφοι
3
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"
Απαντήθηκε 15/09/2008 στις 17:08
πηγή χρήστη

ψήφοι
10

Εδώ είναι μια εναλλακτική λύση στην Python 3.0 που επιτρέπει στοιχεία της λίστας μη-string:

>>> alist = ['a', 1, (2, 'b')]
  • ένα πρότυπο τρόπο

    >>> ", ".join(map(str, alist))
    "a, 1, (2, 'b')"
    
  • η εναλλακτική λύση

    >>> import io
    >>> s = io.StringIO()
    >>> print(*alist, file=s, sep=', ', end='')
    >>> s.getvalue()
    "a, 1, (2, 'b')"
    

ΣΗΜΕΙΩΣΗ: Ο χώρος μετά κόμμα είναι σκόπιμη.

Απαντήθηκε 01/10/2008 στις 08:23
πηγή χρήστη

ψήφοι
3

για τη μετατροπή λίστα με τους αριθμούς κάντε τα εξής:

string  =  ''.join([str(i) for i in list])
Απαντήθηκε 06/09/2012 στις 09:08
πηγή χρήστη

ψήφοι
9

",".join(l)Δεν θα λειτουργήσει για όλες τις περιπτώσεις. Θα πρότεινα τη χρήση του συστήματος CSV με StringIO

import StringIO
import csv

l = ['list','of','["""crazy"quotes"and\'',123,'other things']

line = StringIO.StringIO()
writer = csv.writer(line)
writer.writerow(l)
csvcontent = line.getvalue()
# 'list,of,"[""""""crazy""quotes""and\'",123,other things\r\n'
Απαντήθηκε 10/02/2016 στις 13:43
πηγή χρήστη

ψήφοι
0

Εδώ είναι ένα παράδειγμα με τη λίστα

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Πιο ακριβής:-

>>> myList = [['Apple'],['Orange']]
>>> myList = ','.join(map(str, [type(i) == list and i[0] for i in myList])) 
>>> print "Output:", myList
Output: Apple,Orange

Παράδειγμα 2: -

myList = ['Apple','Orange']
myList = ','.join(map(str, myList)) 
print "Output:", myList
Output: Apple,Orange
Απαντήθηκε 15/05/2017 στις 10:25
πηγή χρήστη

ψήφοι
4
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_listμπορεί να περιέχει οποιοδήποτε είδος των μεταβλητών. Αυτό αποφύγει το αποτέλεσμα 'A,,,D,E'.

Απαντήθηκε 20/05/2017 στις 10:31
πηγή χρήστη

ψήφοι
-2

δύο σεντ μου. Μου αρέσει απλούστερη έναν κωδικό μίας γραμμής σε python:

>>> from itertools import imap, ifilter
>>> l = ['a', '', 'b', 1, None]
>>> ','.join(imap(str, ifilter(lambda x: x, l)))
a,b,1
>>> m = ['a', '', None]
>>> ','.join(imap(str, ifilter(lambda x: x, m)))
'a'

Είναι pythonic, έργα για έγχορδα, αριθμούς, Κανένα και κενό string. Είναι σύντομη και ικανοποιεί τις απαιτήσεις. Αν η λίστα δεν πρόκειται να περιέχει τους αριθμούς, μπορούμε να χρησιμοποιήσουμε αυτή την απλούστερη παραλλαγή:

>>> ','.join(ifilter(lambda x: x, l))

Επίσης, η λύση αυτή δεν δημιουργεί μια νέα λίστα, αλλά χρησιμοποιεί ένα iterator, όπως @Peter Hoffmann τόνισε (ευχαριστώ).

Απαντήθηκε 07/01/2018 στις 11:56
πηγή χρήστη

ψήφοι
-1

λίγο κάτι τέτοιο :)

String = "Once:Upon:a:Time:A:Long:Time:Ago"
ding = String.split(':')

ring = (" , ").join(ding)

print(ring)

Έξοδος: Μία φορά, Μετά, ένα, χρόνος, Α, Long, Time, πριν

Απαντήθηκε 24/04/2018 στις 07:17
πηγή χρήστη

ψήφοι
0

Θα έλεγα ότι η csvβιβλιοθήκη είναι η μόνη λογική επιλογή εδώ, δεδομένου ότι χτίστηκε για να αντιμετωπίσει όλες τις περιπτώσεις χρήσης csv, όπως κόμματα σε μια σειρά, κ.λπ.

Για να εξαγάγετε μια λίστα lσε ένα αρχείο .csv:

import csv
with open('some.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(l)  # this will output l as a single row.  

Είναι επίσης δυνατή η χρήση writer.writerows(iterable)για την παραγωγή πολλών γραμμών σε CSV.

Αυτό το παράδειγμα είναι συμβατή με την Python 3, ως η άλλη απάντηση εδώ χρησιμοποιείται StringIOη οποία είναι Python 2.

Απαντήθηκε 18/06/2018 στις 14:08
πηγή χρήστη

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more