आप स्ट्रिंग की सूची से अल्पविराम से अलग स्ट्रिंग कैसे बनायेंगे?


526

एक क्रम से तारों को समतल करने के लिए आपका पसंदीदा तरीका क्या होगा जैसे कि हर दो लगातार जोड़े के बीच एक अल्पविराम जोड़ा जाता है। उदाहरण के लिए, आप मानचित्र कैसे ['a', 'b', 'c']बनाते हैं 'a,b,c'? (मामलों ['s']और []को मैप किया जाना चाहिए 's'और ''क्रमश।)

मैं आमतौर पर कुछ का उपयोग करके समाप्त होता हूं ''.join(map(lambda x: x+',',l))[:-1], लेकिन कुछ असंतुष्ट भी महसूस कर रहा हूं ।

जवाबों:


967
my_list = ['a', 'b', 'c', 'd']
my_string = ','.join(my_list)
'a,b,c,d'

यदि सूची में पूर्णांक शामिल हैं तो यह काम नहीं करेगा


और यदि सूची में गैर-स्ट्रिंग प्रकार हैं (जैसे पूर्णांक, फ़्लोट्स, बूल, कोई नहीं) तो करें:

my_string = ','.join(map(str, my_list)) 

ध्यान दें कि यदि आप python 2.7 का उपयोग कर रहे हैं (जो आपको अब तक नहीं करना चाहिए) तब str का उपयोग करने से एक अपवाद बढ़ जाएगा यदि सूची में किसी भी आइटम में यूनिकोड है।
kroiz

75

क्यों map/ lambdaजादू? क्या यह काम नहीं करता है?

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

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

यदि सूची में नंबर हैं, तो आप सूची की समझ का उपयोग कर सकते हैं:

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

या एक जनरेटर अभिव्यक्ति:

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

18

",".join(l)सभी मामलों के लिए काम नहीं करेगा। मैं सुझाव देता हूं कि स्ट्रिंग मॉड्यूल के साथ सीएसवी मॉड्यूल का उपयोग करें

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'

StringIOपायथन 3 में कोई नहीं है
रॉन किलियन

4
@RonKalian from io import StringIOPython 3 में उपयोग करें
केविन

13

यहाँ पायथन 3.0 में एक वैकल्पिक समाधान है जो गैर-स्ट्रिंग सूची आइटम की अनुमति देता है:

>>> 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')"

नोट: अल्पविराम के बाद का स्थान जानबूझकर है।


11

क्या आप नहीं चाहते:

",".join(l)

जाहिर है यह अधिक जटिल हो जाता है यदि आपको मानों में अल्पविराम आदि को उद्धृत / भागने की आवश्यकता होती है। उस मामले में मैं मानक पुस्तकालय में सीएसवी मॉड्यूल को देखने का सुझाव दूंगा:

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


10

@ अभिनेता हॉफमैन

जेनरेटर एक्सप्रेशंस का उपयोग करने से एक इटेरेटर के उत्पादन का भी लाभ होता है लेकिन इटर्टूल आयात करना बचाता है। इसके अलावा, सूची की समझ आमतौर पर नक्शे के लिए पसंद की जाती है, इस प्रकार, मैं चाहता हूं कि जनरेटर के भावों को लागू करने के लिए प्राथमिकता दी जाए।

>>> l = [1, "foo", 4 ,"bar"]
>>> ",".join(str(bit) for bit in l)
'1,foo,4,bar' 

7
>>> my_list = ['A', '', '', 'D', 'E',]
>>> ",".join([str(i) for i in my_list if i])
'A,D,E'

my_listकिसी भी प्रकार के चर शामिल हो सकते हैं। यह परिणाम से बचें 'A,,,D,E'


4
l=['a', 1, 'b', 2]

print str(l)[1:-1]

Output: "'a', 1, 'b', 2"

1
मुझे लगता है कि आपको यह बताना चाहिए कि इस पृष्ठ के अन्य समाधानों के विपरीत, आप स्ट्रिंग को भी उद्धृत करते हैं।
mrdevlar

3

@ jmanning2k एक सूची समझ का उपयोग करके एक नई अस्थायी सूची बनाने का नकारात्मक पहलू है। बेहतर समाधान itertools.imap का उपयोग करना होगा जो एक पुनरावर्तक लौटाता है

from itertools import imap
l = [1, "foo", 4 ,"bar"]
",".join(imap(str, l))

यह समाधान खाली स्ट्रिंग के लिए अतिरिक्त अल्पविराम नहीं जोड़ने और कोई नहीं के साथ 'नहीं' जोड़ने की आवश्यकताओं को पूरा नहीं करता है।
रॉबर्टो

जनरेटर की तुलना में str.joinतेजी से काम की जाँच करेंlist
Grijesh Chauhan

3

यहां सूची के साथ एक उदाहरण दिया गया है

>>> 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

1
यह प्रश्न सूचियों के बारे में था, सूचियों की सूचियों का नहीं ।
Eero Aaltonen

@EeroAaltonen मैंने अपना उत्तर अपडेट किया, मुझे सही बताने के लिए धन्यवाद।

1

मैं कहूंगा कि यहां 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)सीएसवी को कई पंक्तियों को आउटपुट करने के लिए उपयोग करना भी संभव है ।

यह उदाहरण पायथन 3 के साथ संगत है, क्योंकि यहां दूसरा जवाब है जिसका इस्तेमाल StringIOपायथन 2 है।


लेकिन क्या वह अन्य उत्तरों की तुलना में बहुत अधिक / जटिल नहीं है?
शांतिनिकेतन I

0

जब तक मुझे कुछ याद नहीं आ रहा है, तब तक ','.join(foo)आपको वही करना चाहिए जो आप पूछ रहे हैं।

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

(संपादित करें: और jmanning2k अंक के रूप में,

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

सुरक्षित और काफी पाइथोनिक है, हालांकि परिणामी स्ट्रिंग को पार्स करना मुश्किल होगा यदि तत्वों में कॉमा हो सकता है - उस बिंदु पर, आपको csvमॉड्यूल की पूरी शक्ति की आवश्यकता होती है , क्योंकि डगलस अपने जवाब में बताते हैं।)


-2

मेरे दो सेंट। मुझे अजगर में एक-लाइन कोड को सरल करना पसंद है:

>>> 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'

यह अजगर है, तार, संख्या, कोई नहीं और खाली स्ट्रिंग के लिए काम करता है। यह छोटा है और आवश्यकताओं को संतुष्ट करता है। यदि सूची में संख्याएँ नहीं हैं, तो हम इस सरल भिन्नता का उपयोग कर सकते हैं:

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

इसके अलावा यह समाधान एक नई सूची नहीं बनाता है, लेकिन @Peter हॉफमैन इंगित (धन्यवाद) की तरह एक पुनरावृत्ति का उपयोग करता है।


यह शानदार है। स्वीकृत उत्तर सरल, प्रत्यक्ष और स्पष्ट रूप से सबसे अच्छा समाधान है। अत्यधिक जटिल विकल्प प्रदान करना समय की बर्बादी है। यदि आप केवल भाषा की अन्य विशेषताओं के बारे में शिक्षित करने का प्रयास कर रहे हैं, जब पहले से ही व्यवहार्य उत्तर हैं, तो आप वही कर रहे हैं जो आप मेरे लिए कर रहे हैं।
स्पष्ट करें
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.