अजगर में तार की एक सूची में शामिल हों और प्रत्येक स्ट्रिंग को उद्धरण चिह्नों में लपेटें


101

मुझे मिल गया है:

words = ['hello', 'world', 'you', 'look', 'nice']

मैं चाहता हूँ:

'"hello", "world", "you", "look", "nice"'

पायथन के साथ ऐसा करने का सबसे आसान तरीका क्या है?

जवाबों:


173
>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> ', '.join('"{0}"'.format(w) for w in words)
'"hello", "world", "you", "look", "nice"'

1
@Meow का उपयोग करता है reprजो इस विशिष्ट मामले में एक लील हैकी है जैसा कि उद्धरणों के साथ स्पष्ट होने का विरोध किया गया है
जैमाइलक

1
@jamlak ठीक है, repr सिर्फ मुझे सुरक्षित लग रहा था अगर आप अपने स्ट्रिंग में उद्धरण है।
मेव

50

आप एकल formatकॉल भी कर सकते हैं

>>> words = ['hello', 'world', 'you', 'look', 'nice']
>>> '"{0}"'.format('", "'.join(words))
'"hello", "world", "you", "look", "nice"'

अपडेट: कुछ बेंचमार्किंग (2009 mbp पर प्रदर्शन):

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.32559704780578613

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(words))""").timeit(1000)
0.018904924392700195

तो ऐसा लगता है कि formatवास्तव में काफी महंगा है

अपडेट 2: @ JCode की टिप्पणी के बाद, mapयह सुनिश्चित करने के लिए एक जोड़ joinदेगा कि पायथन 2.7.12

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.08646488189697266

>>> timeit.Timer("""words = ['hello', 'world', 'you', 'look', 'nice'] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.04855608940124512

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; ', '.join('"{0}"'.format(w) for w in words)""").timeit(1000)
0.17348504066467285

>>> timeit.Timer("""words = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10] * 100; '"{}"'.format('", "'.join(map(str, words)))""").timeit(1000)
0.06372308731079102

क्या यह जैमाइलक द्वारा प्रस्तावित एक से बेहतर प्रदर्शन है?
काड्रियन

3
स्वीकृत उत्तर की तुलना में यह एक बेहतर उपाय है।
ऋषि 88

2
@ sage88 नहीं यह नहीं है। प्रॉपटीमाइजेशन बुराई है, एक 0.0000001% संभावना है कि यहां की मिनीस्क्यूल स्पीड अंतर एक पायथन स्क्रिप्ट की पूरी अड़चन है। इसके अलावा यह कोड बहुत कम सहज है इसलिए यह बेहतर नहीं है , यह बहुत थोड़ा तेज है । मेरा समाधान अधिक pythonic और पठनीय है
jamylak

@marchelbling बेंचमार्क अमान्य है क्योंकि जैमिलक का समाधान गैर-तार के पुनरावृत्तियों के लिए भी काम करता है। के .join(words)साथ बदलें .join(map(str, words))और हमें बताएं कि यह कैसे जाता है।
वल्हु

@JCode ने बेंचमार्क अपडेट किया। अंतर छोटा है, लेकिन अभी भी मेरी मशीन पर 2x लाभ है।
marchelbling

39

आप यह कोशिश कर सकते हैं:

str(words)[1:-1]

3
यह उद्धरण कैसे जोड़ता है?
देजेल

6
यह दोहरे के बजाय एकल उद्धरण चिह्न जोड़ता है, लेकिन शब्दों के अंदर उद्धरण स्वचालित रूप से बच जाएगा। चतुरता के लिए +1।
फेलिक्स कैरन

यह उन चतुर tidbits में से एक है जो अजगर को इतना पुरस्कृत करता है।
मैक्स वॉन हिप्पेल

यह बहुत अद्भुत है, बस इसे प्यार करता हूं, लेकिन मैं शायद अपने साथी देवों के लिए कोड को थोड़ा अधिक सहज बनाने के लिए अन्य समाधान का उपयोग करूंगा।
यश शर्मा


3

एफ स्ट्रिंग्स (अजगर 3.6+ के लिए) के साथ @jamylak उत्तर का एक अद्यतन संस्करण, मैंने एसक्यूएल स्क्रिप्ट के लिए उपयोग किए जाने वाले स्ट्रिंग के लिए बैकटिक्स का उपयोग किया है।

keys = ['foo', 'bar' , 'omg']
', '.join(f'`{k}`' for k in keys)
# result: '`foo`, `bar`, `omg`'

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