पायथन में तार की सूची में एक ही स्ट्रिंग को लागू करना


182

मैं एक स्ट्रिंग लेने की कोशिश कर रहा हूं, और इसे एक सूची में सम्‍मिलित हर स्ट्रिंग में जोड़ देता हूं, और फिर पूरी की गई स्ट्रिंग के साथ एक नई सूची बनाता हूं। उदाहरण:

list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

*magic*

list2 = ['foobar', 'fobbar', 'fazbar', 'funkbar']

मैंने छोरों के लिए कोशिश की, और सूची समझ पर एक प्रयास, लेकिन यह कचरा था। हमेशा की तरह, कोई मदद, बहुत सराहना की।


25
यह listएक अंतर्निहित है क्योंकि यह असाइन करने के लिए नासमझ है।
नौफाल इब्राहिम

जवाबों:


314

ऐसा करने का सबसे सरल तरीका एक सूची समझ के साथ है:

[s + mystring for s in mylist]

ध्यान दें कि मैंने बिलिन नामों का उपयोग करने से परहेज किया है listक्योंकि वह छाया या निर्मित नामों को छिपाता है, जो बहुत अच्छा नहीं है।

इसके अलावा, अगर आपको वास्तव में एक सूची की आवश्यकता नहीं है, लेकिन सिर्फ एक itरेटर की जरूरत है, तो एक जनरेटर अभिव्यक्ति अधिक कुशल हो सकती है (हालांकि यह छोटी सूचियों पर कोई फर्क नहीं पड़ता):

(s + mystring for s in mylist)

ये बहुत शक्तिशाली, लचीले और संक्षिप्त हैं। हर अच्छे अजगर प्रोग्रामर को उन्हें छेड़ना सीखना चाहिए।


8
या एक जीनक्सपी यदि आप इसे आलसी चाहते हैं(s + mystring for s in mylist)
नूफ़ल इब्राहिम

यह निश्चित रूप से चाल है, बहुत बहुत धन्यवाद, फिर भी सूची समझ के आसपास मेरे सिर को लपेटता है, अगर आप इस पर एक अच्छा ट्यूटोरियल जानते हैं। सूची में प्रत्येक आइटम से पहले, एक यू है ', क्या वह यूनिकोड के लिए है?
केविन

3
@ केविन, यहां यूनिकोड स्ट्रिंग्स के लिए एक ट्यूटोरियल है, docs.python.org/tutorial/introduction.html#tut-unicodestrings
tgray

यदि आपको उस सूची से सूचकांक की आवश्यकता है जो आप कर सकते हैं["{}) {}".format(i, s) for i, s in enumerate(mylist)]
वापीद लिनुस

1
नोट करने के लिए कुछ: यदि आप "रहस्य" को "एस" से पहले जोड़ते हैं, बजाय इसके बाद, यह "एस" की शुरुआत में "रहस्य" को संक्षिप्त कर देगा। जैसे list2 = ["mystring" + s for s in mylist]=list2 = ['barfoo', 'barfob', 'barfaz', 'barfunk']
पॉल टकेट

25
my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
my_new_list = [x + string for x in my_list]
print my_new_list

यह प्रिंट करेगा:

['foobar', 'fobbar', 'fazbar', 'funkbar']

5

map मुझे नौकरी के लिए सही उपकरण की तरह लगता है।

my_list = ['foo', 'fob', 'faz', 'funk']
string = 'bar'
list2 = list(map(lambda orig_string: orig_string + string, my_list))

अधिक उदाहरणों के लिए कार्यात्मक प्रोग्रामिंग टूल पर इस अनुभाग को देखें map


2

निम्नलिखित प्रयोग पायथोनिक तरीके से चलाना:

[s + mystring for s in mylist]

इस तरह लूप के स्पष्ट उपयोग की तुलना में ~ 35% अधिक तेज़ लगता है:

i = 0
for s in mylist:
    mylist[i] = s+mystring
    i = i + 1

प्रयोग

import random
import string
import time

mystring = '/test/'

l = []
ref_list = []

for i in xrange( 10**6 ):
    ref_list.append( ''.join(random.choice(string.ascii_lowercase) for i in range(10)) )

for numOfElements in [5, 10, 15 ]:

    l = ref_list*numOfElements
    print 'Number of elements:', len(l)

    l1 = list( l )
    l2 = list( l )

    # Method A
    start_time = time.time()
    l2 = [s + mystring for s in l2]
    stop_time = time.time()
    dt1 = stop_time - start_time
    del l2
    #~ print "Method A: %s seconds" % (dt1)

    # Method B
    start_time = time.time()
    i = 0
    for s in l1:
        l1[i] = s+mystring
        i = i + 1
    stop_time = time.time()
    dt0 = stop_time - start_time
    del l1
    del l
    #~ print "Method B: %s seconds" % (dt0)

    print 'Method A is %.1f%% faster than Method B' % ((1 - dt1/dt0)*100)

परिणाम

Number of elements: 5000000
Method A is 38.4% faster than Method B
Number of elements: 10000000
Method A is 33.8% faster than Method B
Number of elements: 15000000
Method A is 35.5% faster than Method B

2

"स्ट्रिंग्स की एक सूची में तार की एक सूची को लागू करना" को थोड़ा बढ़ाकर:

    import numpy as np
    lst1 = ['a','b','c','d','e']
    lst2 = ['1','2','3','4','5']

    at = np.full(fill_value='@',shape=len(lst1),dtype=object) #optional third list
    result = np.array(lst1,dtype=object)+at+np.array(lst2,dtype=object)

परिणाम:

array(['a@1', 'b@2', 'c@3', 'd@4', 'e@5'], dtype=object)

dtype odject आगे str परिवर्तित किया जा सकता है


अपडेट: आप एक ही प्रतीक को कई बार कॉपी करने से बच सकते हैं: at = np.full(fill_value='@',shape=1,dtype=object) या बस: at = np.array("@", dtype=object)
आर्टूर सोकोलोव्स्की

1

आप अजगर में नक्शे के अंदर लैम्ब्डा का उपयोग कर सकते हैं। एक ग्रे कोड जनरेटर लिखा है। https://github.com/rdm750/rdm750.github.io/blob/master/python/gray_code_generator.py # आपका कोड यहाँ जाता है '' n-1 बिट कोड, प्रत्येक शब्द के लिए 0 से पहले, इसके बाद। एन-1 बिट कोड रिवर्स ऑर्डर में, प्रत्येक शब्द के लिए 1 पूर्वनिर्मित। '' '

    def graycode(n):
        if n==1:
            return ['0','1']
        else:
            nbit=map(lambda x:'0'+x,graycode(n-1))+map(lambda x:'1'+x,graycode(n-1)[::-1])
            return nbit

    for i in xrange(1,7):
        print map(int,graycode(i))

1

अधिक विकल्पों के साथ अद्यतन करना

list1 = ['foo', 'fob', 'faz', 'funk']
addstring = 'bar'
for index, value in enumerate(list1):
    list1[index] = addstring + value #this will prepend the string
    #list1[index] = value + addstring this will append the string

इसके बजाय 'लिस्ट', 'लिस्ट' के रूप में 'लिस्ट' के नाम से वेरिएबल जैसे कीवर्ड्स के इस्तेमाल से बचें


यह एक अच्छा सुझाव है। एक और एक स्ट्रिंग के साथ एक फ़ंक्शन के साथ array_map का उपयोग किया जाएगा ... php.net/manual/en/function.array-map.php
ROunofF

1

यहाँ एक सरल उत्तर दिया गया है pandas

import pandas as pd
list1 = ['foo', 'fob', 'faz', 'funk']
string = 'bar'

list2 = (pd.Series(list1) + string).tolist()
list2
# ['foobar', 'fobbar', 'fazbar', 'funkbar']

कृपया सूची और स्ट्रिंग से चर का नाम बदलकर कुछ और करें। सूची एक बिलियन अजगर प्रकार है
संगी

0
list2 = ['%sbar' % (x,) for x in list]

और listनाम के रूप में उपयोग न करें ; यह अंतर्निहित प्रकार को छाया देता है।


'%sbar' % (x,)इसके बजाय क्यों '%sbar' % x? क्यों नहीं x + 'bar'?
जॉन मैकिन

1
यदि x टुप होता है तो दूसरा विफल हो जाएगा। जाहिर है आप हर तत्व को एक स्ट्रिंग होने की योजना बनाते हैं, लेकिन कभी-कभी चीजें गलत हो जाती हैं। पहले और तीसरे के बीच अंतर ज्यादातर स्वाद है, जब तक कि आपको बाहरी स्रोत से स्ट्रिंग नहीं मिलती।
इग्नासियो वाज़क्वेज़-अब्राम्स

2
'अपवाद छोड़ें'! = 'विफल'। यदि आपके पास गलत डेटा प्रकार है, तो आप पहले ही विफल हो चुके हैं । मेरी पसंदीदा अभिव्यक्ति विफलता को उजागर करने वाले एक अपवाद को उठाती है; आपकी पसंदीदा अभिव्यक्ति चुपचाप कचरा पैदा करती है। स्वाद: बारोक धीमी गति के भाव मेरे स्वाद के नहीं हैं।
जॉन माकिन

0
new_list = [word_in_list + end_string for word_in_list in old_list]

आपके चर नामों के लिए "सूची" जैसे नामों का उपयोग करना बुरा है क्योंकि यह निर्मितियों को अधिलेखित / ओवरराइड करेगा।


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