स्ट्रिंग सरणी के बजाय ऑब्जेक्ट सरणी पर पायथन string.join (सूची)


291

पायथन में, मैं कर सकता हूँ:

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

क्या मेरे पास वस्तुओं की सूची होने पर ऐसा करने का कोई आसान तरीका है?

>>> class Obj:
...     def __str__(self):
...         return 'name'
...
>>> list = [Obj(), Obj(), Obj()]
>>> ', '.join(list)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: sequence item 0: expected string, instance found

या क्या मुझे लूप के लिए सहारा लेना है?

जवाबों:


432

आप इसके बजाय सूची समझ या जनरेटर अभिव्यक्ति का उपयोग कर सकते हैं:

', '.join([str(x) for x in list])  # list comprehension
', '.join(str(x) for x in list)    # generator expression

3
या एक जनरेटर अभिव्यक्ति: ',' .join (str (x) सूची में x के लिए)
dF।

1
उनमें से कौन सा विचार तेज होगा?
गोजिल्ली

मेरे प्रयोगों का कहना है कि छोटी समझ वाली सूचियों पर सूची 60% अच्छी हो सकती है (तीन ऑब्जेक्ट (एस) की सूची पर 10 ^ 6 बार प्रयोग करें)। हालाँकि, उनका प्रदर्शन बड़ी सूचियों (2 प्रयोग 10 ^ 7 ऑब्जेक्ट्स () सूची पर एक बार चलने) पर समान है।
गुज्जीली

3
एक अच्छे 30% स्पीड-अप (ऊपर जनरेटर अभिव्यक्ति पर) के लिए, एक माना जाता है कि कम पठनीय mapअभिव्यक्ति (नीचे) का उपयोग कर सकते हैं ।
K3 --- rnc

2
यह उत्तर वस्तुनिष्ठ रूप से mapहल से भी बदतर है ।
पास्कलवूटेन

96

अंतर्निहित स्ट्रिंग निर्माता स्वचालित रूप से कॉल करेगा obj.__str__:

''.join(map(str,list))

1
नक्शा () सूची में परिवर्तन नहीं करता है, यह ओ में सूची के लिए [str (o) के बराबर है]
dF।

11
+1: मानचित्र एक अच्छा दृष्टिकोण है; "सूची बदलना" एक सटीक टिप्पणी नहीं है।
एस.लॉट

2
(एक और) +1 .. नक्शा कम पठनीय नहीं है, बस यह जानना आवश्यक है कि मानचित्र फ़ंक्शन क्या करता है
lapax

1
@ मिचेल सही नहीं। reduceवह था जिसे हटा दिया गया था, क्योंकि यह आमतौर पर लोगों को अनुमान लगाता था और इस तरह "पायथोनिक" नहीं था। mapदूसरी ओर एक मुद्दा नहीं है।
पास्कलवूटेन

1
(अन्य) +1: पर्ल दुनिया से आ रहा है यह ब्रह्मांड में सबसे आम बात है: सम्मिलित हों ("sep", सूची) - और सूची के सभी तत्व उनके स्ट्रिंग प्रतिनिधित्व में परिवर्तित हो जाते हैं। मैं वास्तव में अजगर में एक समाधान खोजने के लिए संघर्ष कर रहा हूं।
जेसन

2

एक अन्य समाधान स्ट्रै क्लास के ज्वाइन ऑपरेटर को ओवरराइड करना है।

चलिए एक नए वर्ग my_string को निम्न प्रकार से परिभाषित करते हैं

class my_string(str):
    def join(self, l):
        l_tmp = [str(x) for x in l]
        return super(my_string, self).join(l_tmp)

तब आप कर सकते हैं

class Obj:
    def __str__(self):
        return 'name'

list = [Obj(), Obj(), Obj()]
comma = my_string(',')

print comma.join(list)

और आपको मिलता है

name,name,name

BTW, सूची को चर नाम के रूप में उपयोग करके आप सूची वर्ग (कीवर्ड) को फिर से परिभाषित कर रहे हैं! अधिमानतः एक अन्य पहचानकर्ता नाम का उपयोग करें।

आशा है कि आपको मेरा उत्तर उपयोगी लगेगा।


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.