एक सूची की सामग्री लें और इसे दूसरी सूची में जोड़ें


191

मैं यह समझने की कोशिश कर रहा हूं कि क्या यह एक सूची की सामग्री को लेने और दूसरी सूची में जोड़ने के लिए समझ में आता है।

मेरे पास लूप फ़ंक्शन के माध्यम से बनाई गई पहली सूची है, जो एक फ़ाइल से विशिष्ट लाइनें प्राप्त करेगी और उन्हें एक सूची में बचाएगा।

फिर इन पंक्तियों को सहेजने के लिए दूसरी सूची का उपयोग किया जाता है, और किसी अन्य फ़ाइल पर एक नया चक्र शुरू किया जाता है।

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

यह कुछ इस तरह दिखता है:

# This is done for each log in my directory, i have a loop running
for logs in mydir:

    for line in mylog:
        #...if the conditions are met
        list1.append(line)

    for item in list1:
        if "string" in item: #if somewhere in the list1 i have a match for a string
            list2.append(list1) # append every line in list1 to list2
            del list1 [:] # delete the content of the list1
            break
        else:
            del list1 [:] # delete the list content and start all over

क्या यह समझ में आता है या मुझे एक अलग मार्ग के लिए जाना चाहिए?

मुझे कुछ कुशल की आवश्यकता है जो बहुत अधिक चक्र नहीं उठाएंगे, क्योंकि लॉग की सूची लंबी है और प्रत्येक पाठ फ़ाइल बहुत बड़ी है; इसलिए मैंने सोचा था कि सूचियाँ उद्देश्य के अनुकूल होंगी।

जवाबों:


369

आप शायद चाहते हैं

list2.extend(list1)

के बजाय

list2.append(list1)

यहाँ अंतर है:

>>> a = range(5)
>>> b = range(3)
>>> c = range(2)
>>> b.append(a)
>>> b
[0, 1, 2, [0, 1, 2, 3, 4]]
>>> c.extend(a)
>>> c
[0, 1, 0, 1, 2, 3, 4]

चूंकि list.extend()एक मनमाना चलने को स्वीकार करता है, आप बदल भी सकते हैं

for line in mylog:
    list1.append(line)

द्वारा

list1.extend(mylog)

हाँ, परिशिष्ट एक तत्व के लिए है, विस्तार समास की तरह है।
कैटालिना चिरकु

13

छोटी सूची को कॉपी किए बिना कई छोटी सूचियों को एक बड़ी सूची (या कम से कम एक बड़ी चलने योग्य के रूप में) के इलाज के लिए तेजी से तरीके के लिए itertools.chain पर एक नज़र डालें :

>>> import itertools
>>> p = ['a', 'b', 'c']
>>> q = ['d', 'e', 'f']
>>> r = ['g', 'h', 'i']
>>> for x in itertools.chain(p, q, r):
        print x.upper()

यह वास्तव में चालाक लगता है! मैं यह देखने के लिए इस पर एक नज़र डालूंगा कि क्या मैं उस कोड को प्रतिस्थापित कर सकता हूं जो मेरे पास पहले से ही इटर्टूल का उपयोग कर रहा है!
user1006198

3

जो आप करने की कोशिश कर रहे हैं, उसके लिए यह काफी उचित लगता है।

एक छोटा सा संस्करण जो भारी उठाने के लिए पायथन पर झुक जाता है वह हो सकता है:

for logs in mydir:

    for line in mylog:
        #...if the conditions are met
        list1.append(line)

    if any(True for line in list1 if "string" in line):
        list2.extend(list1)
    del list1

    ....

(True for line in list1 if "string" in line)अधिक दोहराता listऔर उत्सर्जन करता है Trueजब भी मिलान हो जाता है। पहला तत्व मिलते ही any()लौटने के लिए शॉर्ट-सर्किट मूल्यांकन का उपयोग करता है। अंत की सामग्री को जोड़ता है ।TrueTruelist2.extend()list1


1
any(True for line in list1 if "string" in line)अधिक करीने से लिखा गया है any("string" in line for line in list1)
कार्ल केनचेल

अच्छी बात है, @KarlKnechtel, हालाँकि वे सूक्ष्म रूप से भिन्न हैं। आपका संस्करण हमेशा कुछ या तो सही या गलत का उत्सर्जन करता है । मेरा केवल एक ही सच का उत्सर्जन करता है। मुझे पता नहीं है कि कैसे उन बेंचमार्क से बाहर है, या क्या वहाँ बिल्कुल फर्क पड़ता है।
कर्क स्ट्रूसर

दोनों मामलों में, anyएक जनरेटर प्राप्त करता है; कहीं भी ट्रू या फाल्स वैल्यू की कोई सूची नहीं बनाई गई है। मेरा संस्करण anyजाँच के लिए और चीज़ें लौटाता है , लेकिन बदले में जनरेटर में ही जाँच न करने के लिए। मुझे लगता है कि यह एक धोने है, लेकिन timeitयहाँ आधिकारिक है, मुझे नहीं। :)
कार्ल केनचेल

3

आप '+' ऑपरेटर का उपयोग करके दो सूचियों (a, b) को भी जोड़ सकते हैं। उदाहरण के लिए,

a = [1,2,3,4]
b = [4,5,6,7]
c = a + b

Output:
>>> c
[1, 2, 3, 4, 4, 5, 6, 7]

3

पिछले उत्तरों पर पुनरावृत्ति करने के लिए। यदि आपके पास एक सूची है और आप के [0,1,2]साथ एक और एक है [3,4,5]और आप उन्हें मर्ज करना चाहते हैं, तो यह बन जाता है [0,1,2,3,4,5], आप या तो उपयोग कर सकते हैं chainingया extendingअपनी आवश्यकताओं के लिए इसे बुद्धिमानी से उपयोग करने के लिए मतभेदों को जानना चाहिए।

एक सूची का विस्तार

listकक्षाओं की extendविधि का उपयोग करके , आप एक सूची से दूसरे पर तत्वों की एक प्रतिलिपि बना सकते हैं। हालाँकि, यह अतिरिक्त मेमोरी उपयोग का कारण बनेगा, जो कि ज्यादातर मामलों में ठीक होना चाहिए, लेकिन यदि आप मेमोरी को कुशल बनाना चाहते हैं तो समस्या हो सकती है।

a = [0,1,2]
b = [3,4,5]
a.extend(b)
>>[0,1,2,3,4,5]

यहां छवि विवरण दर्ज करें

एक सूची का पीछा करते हुए

इसके विपरीत आप itertools.chainकई सूचियों को तार करने के लिए उपयोग कर सकते हैं , जो एक तथाकथित लौटाएगा जिसका iteratorउपयोग सूचियों पर पुनरावृति करने के लिए किया जा सकता है। यह अधिक स्मृति कुशल है क्योंकि यह तत्वों की नकल नहीं कर रहा है, लेकिन सिर्फ अगली सूची की ओर इशारा करता है।

import itertools
a = [0,1,2]
b = [3,4,5]
c = itertools.chain(a, b)

यहां छवि विवरण दर्ज करें

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


2

निर्मित map()और reduce()निर्मित कार्यों का उपयोग करना

def file_to_list(file):
     #stuff to parse file to a list
     return list

files = [...list of files...]

L = map(file_to_list, files)

flat_L = reduce(lambda x,y:x+y, L)

न्यूनतम "लूपिंग" और सुरुचिपूर्ण कोडिंग पैटर्न के लिए :)


0

अगर हमारे पास नीचे की तरह सूची है:

list  = [2,2,3,4]

इसे दूसरी सूची में कॉपी करने के दो तरीके।

1।

x = [list]  # x =[] x.append(list) same 
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 1
[2, 2, 3, 4]

2।

x = [l for l in list]
print("length is {}".format(len(x)))
for i in x:
    print(i)
length is 4
2
2
3
4
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.