একটি তালিকার বিষয়বস্তু নিন এবং এটিকে অন্য তালিকায় যুক্ত করুন


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

ছোট ছোট তালিকাগুলি অনুলিপি না করে অনেকগুলি ছোট তালিকাকে একক বড় তালিকা হিসাবে (বা কমপক্ষে একক বৃহত পুনরাবৃত্ত হিসাবে বিবেচনা করা) দ্রুত পদ্ধতিতে ব্যবহার করার জন্য এটির টোলগুলি দেখুন :

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

সত্যিই চটচটে শোনায়! আমি এরটিতে একবার দেখে নেব যে আমি ইতিমধ্যে ইটারটুলগুলি ব্যবহার করে যে কোডটি ব্যবহার করেছি তা প্রতিস্থাপন করতে পারি কিনা!
ব্যবহারকারী 1006198

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)ওভার iterates 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)
কার্ল নচেটেল

ভাল কথা, @ কার্লকনেটেল, যদিও তারা একেবারে আলাদা। আপনার সংস্করণটি সর্বদা সত্য বা মিথ্যা কোনও কিছু নির্গত করে । খনি কেবলমাত্র একক সত্যকে নির্গত করে। এই মানদণ্ডগুলি কীভাবে আউট হয়ে যায়, বা আদৌ যথেষ্ট পরিমাণে পার্থক্য রয়েছে কিনা তা আমার কোনও ধারণা নেই।
কर्क স্ট্রুজার

উভয় ক্ষেত্রেই anyএকটি জেনারেটর গ্রহণ করে; সত্য বা মিথ্যা মানগুলির কোনও তালিকা কোথাও নির্মিত হয় না। আমার সংস্করণটি anyচেক করার জন্য আরও জিনিস ফিরিয়ে দেয় , তবে জেনারেটরে নিজেই একই চেকটি না করার পরিবর্তে। আমি ধারণা করি এটি ধোয়া, তবে timeitএখানে কর্তৃত্বপূর্ণ, আমি নয়। :)
কার্ল নচেটেল

3

আপনি '+' অপারেটরটি ব্যবহার করে দুটি তালিকাও (একটি বলুন) একত্রিত করতে পারেন। উদাহরণ স্বরূপ,

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
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.