পাইথনে আমি দুটি তালিকা কীভাবে একত্রিত করব?


2522

পাইথনে আমি দুটি তালিকা কীভাবে একত্রিত করব?

উদাহরণ:

listone = [1, 2, 3]
listtwo = [4, 5, 6]

প্রত্যাশিত ফলাফল:

>>> joinedlist
[1, 2, 3, 4, 5, 6]

6
আপনি কি কেবল সংযোজন করতে চান , বা আপনি দুটি তালিকা সাজানো ক্রমে মার্জ করতে চান ? আপনি [1,3,6] এবং [2,4,5] এর জন্য কী আউটপুট আশা করবেন? আমরা কি ধরে নিতে পারি যে উভয় সাবলিস্টগুলি ইতিমধ্যে বাছাই করা হয়েছে (যেমন আপনার উদাহরণ হিসাবে)?
স্মি

1
... এছাড়াও যদি তালিকাগুলির সদৃশ থাকে [1,2,5] and [2,4,5,6]? আপনি কি চান যে ডুপ্লিকেটগুলি অন্তর্ভুক্ত, বাদ, বা যত্ন নেই?
স্মি

উত্তর:


3896

আপনি +তাদের একত্রিত করতে অপারেটরটি ব্যবহার করতে পারেন :

listone = [1,2,3]
listtwo = [4,5,6]

joinedlist = listone + listtwo

আউটপুট:

>>> joinedlist
[1,2,3,4,5,6]

109
এটি কি তালিকার গভীর অনুলিপি তৈরি করে এবং তালিকাতে সংযোজন করে?
ড্যানিয়েল এফ

152
@ ড্যানিয়েল এটি প্রথম তালিকার আইটেমগুলির অগভীর অনুলিপি সহ একটি নতুন তালিকা তৈরি করবে এবং তারপরে দ্বিতীয় তালিকার আইটেমগুলির অগভীর অনুলিপি তৈরি করবে। তালিকাগুলির গভীর অনুলিপি পেতে কপি.দীপকপি ব্যবহার করুন।
ড্যানিয়েল জি

219
এখানে আরেকটি দরকারী বিশদ: listone += listtwoফলাফলlistone == [1, 2, 3, 4, 5, 6]
রিকনাগনি

16
@ br1ckb0t এতে কি লিস্টোন ইশারা করছে তা বদলে যাবে? সুতরাং: তালিকা 3 list3 = listone listone+=listtwo পাশাপাশি পরিবর্তন করা হয়?
মাইকএইচ

11
এটি তালিকা পরিবর্তন 3। তবে, যদি এটি কোনও সমস্যা না হয় তবে দুটি নতুন তালিকা যুক্ত করার পরিবর্তে এটি আরও সহজ পাঠযোগ্য।
রিকনাগনি

316

এমন কোনও জেনারেটর তৈরি করাও সম্ভব যা উভয় তালিকার আইটেমগুলি ব্যবহার করে কেবল পুনরাবৃত্তি করে itertools.chain()। এটি আপনাকে আইটেমগুলিকে কোনও নতুন তালিকায় অনুলিপি না করে প্রক্রিয়াজাতকরণের জন্য একসাথে তালিকাগুলি (বা কোনও পুনরাবৃত্তযোগ্য) করতে দেয়:

import itertools
for item in itertools.chain(listone, listtwo):
    # Do something with each list item

4
chainদুটি তালিকার জন্য ধীরে ধীরে (তবে খুব বেশি নয়), তবে একাধিক তালিকাগুলি (এন >> 2) শৃঙ্খলার জন্য দ্রুততম সমাধান।
সিএস 95

@ সিএস 95 কিসের তুলনায় ধীর?
মোবার্গ

@ মোবার্গ কনটেনেটিং তালিকার অন্যান্য পদ্ধতির তুলনায়, রেফারেন্সের জন্য দয়া করে এখানে আমার মানদণ্ড দেখুন ।
সিএস 95

262

পাইথনের >= 3.5বিকল্প:[*l1, *l2]

আর একটি বিকল্পের গ্রহণযোগ্যতার মাধ্যমে প্রবর্তন করা হয়েছে PEP 448যার উল্লেখযোগ্য।

পিইপি, অতিরিক্ত আনপ্যাকিং জেনারালাইজেশনস শিরোনাম , *পাইথনে তারকাচিহ্নিত অভিব্যক্তিটি ব্যবহার করার সময় সাধারণত কিছু সিনট্যাকটিক বিধিনিষেধ হ্রাস করে ; এটির সাথে দুটি তালিকায় যোগ দেওয়া (যে কোনও পুনরাবৃত্তির ক্ষেত্রে প্রযোজ্য) এখন তা দিয়েও করা যেতে পারে:

>>> l1 = [1, 2, 3]
>>> l2 = [4, 5, 6]
>>> joined_list = [*l1, *l2]  # unpack both iterables in a list literal
>>> print(joined_list)
[1, 2, 3, 4, 5, 6]

পাইথনের জন্য3.5 এই কার্যকারিতাটি সংজ্ঞায়িত করা হয়েছিল যা এটি 3.xপরিবারের পূর্ববর্তী সংস্করণগুলিতে ব্যাকপোর্ট করা হয়নি । অসমর্থিত সংস্করণগুলিতে একটি SyntaxErrorউত্থাপিত হতে চলেছে।

অন্যান্য পদ্ধতির মতো এটিও সংশ্লিষ্ট তালিকার উপাদানগুলির অগভীর অনুলিপি হিসাবে তৈরি করে


গোলমালে এই পদ্ধতির যে আপনি সত্যিই এটা সম্পাদন করতে আদেশ, কিছু যে iterable কি করতে হবে এ তালিকা না প্রয়োজন হয়। পিইপি হিসাবে বলা হয়েছে:

এটি তালিকায় পুনরাবৃত্তসংখ্যার যোগফলের আরও পঠনযোগ্য উপায় হিসাবে দরকারী, যেমন my_list + list(my_tuple) + list(my_range)এখন ন্যায়বিচারের সমান [*my_list, *my_tuple, *my_range]

সুতরাং যখন সঙ্গে উপরন্তু +একটি বাড়াতে হবে TypeErrorমেলেনি টাইপ কারণে:

l = [1, 2, 3]
r = range(4, 7)
res = l + r

নিম্নলিখিতগুলি করবে না:

res = [*l, *r]

কারণ এটি প্রথমে পুনরাবৃত্ত সামগ্রীর সামগ্রীগুলি আনপ্যাক করবে এবং তারপরে কেবল listসামগ্রীগুলি থেকে একটি তৈরি করবে।


1
পুনরাবৃত্তীয় ধরণের উপর কাজ করে আনপ্যাকিং পদ্ধতির একটি দুর্দান্ত উদাহরণ হ'ল ফাংশনগুলি যা আপনি যে তালিকার সাথে তাল মিলিয়ে চলেছেন সেই তালিকার একটির উপরে একটি পুনরাবৃত্তিকে ফেরত দেয়। উদাহরণস্বরূপ, যদি আপনি তালিকা আপনি concatenating করছি এক বিপরীত পারে: res = [*l1, *reversed(l2)]। যেহেতু reversedএকটি পুনরাবৃত্তি প্রদান করে, res = l1 + reversed(l2)একটি ত্রুটি নিক্ষেপ করবে।
অ্যালান

2
এটি লক্ষণীয় যে এটি পাইথনে অভিধানের সংমিশ্রণের সাথে সমান। ডিক 3 = {** ডিক্ট 1, ** ডিক্ট 2} লক্ষ্য করুন যে আমরা ** অভিধানের আনপ্যাক করতে ব্যবহার করি সেখানে তালিকাগুলি আনপ্যাক করার জন্য আমরা ব্যবহার করি *
কেভিন এস

212

আপনি অনন্য মানগুলির মার্জড তালিকা পেতে সেটগুলি ব্যবহার করতে পারেন

mergedlist = list(set(listone + listtwo))

45
সত্য, তবে এটি ডুপ্লিকেটগুলিও সরিয়ে ফেলবে, যদি এটি আপনার আগ্রহী হয়। বরাবর তালিকা যোগ করুন এটি না করে।
রূপকথার

1
সেটি করার এবং আদেশের তথ্য রাখার উপায় কী?
নাতিম

11
এর চেয়ে ভালlistone + [x for x in listtwo if x not in listone]
নাতিম

8
+1 আইএমএইচও এটি "মার্জ" (ইউনিয়ন) তালিকার সঠিক উপায় এবং "অনুমোদিত" উত্তর বর্ণনা করে কীভাবে তালিকাগুলিকে একত্রিত করতে / যুক্ত করতে পারে (মাল্টিসেট)
আলফাসিন

2
আপনি যদি ইনপুট অর্ডার বজায় রাখার বিষয়ে চিন্তা করেন, তবে import collections; mergedlist = list(collections.OrderedDict.fromkeys(listone + listtwo))কৌশলটি করবেন।
শেঠমোর্টন

185

আপনি অন্যটির শেষে list.extend()একটি যুক্ত করতেও এই পদ্ধতিটি ব্যবহার করতে পারেন list:

listone = [1,2,3]
listtwo = [4,5,6]

listone.extend(listtwo)

আপনি যদি মূল তালিকাটি অক্ষত রাখতে চান তবে আপনি একটি নতুন listঅবজেক্ট এবং এতে extendউভয় তালিকাগুলি তৈরি করতে পারেন:

mergedlist = []
mergedlist.extend(listone)
mergedlist.extend(listtwo)

80

পাইথনে আমি দুটি তালিকা কীভাবে একত্রিত করব?

৩.7 হিসাবে, অজগরটিতে দুটি (বা আরও) তালিকার তালিকা তৈরি করার জন্য এগুলি সর্বাধিক জনপ্রিয় স্টেডলিব পদ্ধতি।

এখানে চিত্র বর্ণনা লিখুন

পাদটিকা

  1. এটি সংবেদনশীলতার কারণে এটি একটি চতুর সমাধান। কিন্তু sumজোড়াযুক্ত ফ্যাশনে কনক্যাটেনেশন সম্পাদন করে, যার অর্থ এটি একটি চতুর্ভুজ অপারেশন কারণ প্রতিটি পদক্ষেপের জন্য মেমরি বরাদ্দ করতে হয়। আপনার তালিকাগুলি বড় হলে ব্যবহার করবেন না।

  2. দস্তাবেজগুলি দেখুন chain এবং দেখুন chain.from_iterable। আপনার import itertoolsপ্রথমে দরকার হবে । কনটেনটেশন মেমরির ক্ষেত্রে লিনিয়ার, তাই পারফরম্যান্স এবং সংস্করণ সামঞ্জস্যের দিক থেকে এটি সেরা। chain.from_iterable2.6 সালে চালু হয়েছিল।

  3. এই পদ্ধতিটি অতিরিক্ত আনপ্যাকিং জেনারালাইজেশন (পিইপি 448) ব্যবহার করে তবে এন তালিকাগুলিতে সাধারণীকরণ করতে পারবেন না যদি আপনি নিজে প্রত্যেককে প্যাক না করেন।

  4. a += bএবং a.extend(b)সমস্ত ব্যবহারিক উদ্দেশ্যে কম বা বেশি সমতুল্য। +=যখন কোনও তালিকায় কল করা হয় তখন অভ্যন্তরীণভাবে কল হবে list.__iadd__যা প্রথম তালিকাকে দ্বিতীয় দ্বারা প্রসারিত করবে।


কর্মক্ষমতা

2-তালিকা কনক্যাটেনেশন 1

এখানে চিত্র বর্ণনা লিখুন

এই পদ্ধতির মধ্যে খুব বেশি পার্থক্য নেই তবে তাদের বোঝার বোঝায় যে তাদের সবার জটিলতার একই ক্রম রয়েছে (রৈখিক)। শৈলীর বিষয় বাদে একে অপরের চেয়ে বেশি পছন্দ করার কোনও বিশেষ কারণ নেই।

এন-তালিকা কনকনাটেশন

এখানে চিত্র বর্ণনা লিখুন

পারফ্লোট মডিউল ব্যবহার করে প্লট তৈরি করা হয়েছে । আপনার রেফারেন্সের জন্য কোড।

1. iadd( +=) এবং extendপদ্ধতিগুলি স্থানে কাজ করে, তাই পরীক্ষার আগে প্রতিবার একটি অনুলিপি তৈরি করতে হয়। জিনিসগুলি সুষ্ঠু রাখতে, সমস্ত পদ্ধতির বাম-হাতের তালিকার প্রাক-কপির পদক্ষেপ রয়েছে যা এড়ানো যায়।


অন্যান্য সমাধান সম্পর্কে মন্তব্য

  • কোনওভাবেই list.__add__, আকার বা আকারে ডান্ডার মেথড ব্যবহার করবেন না । প্রকৃতপক্ষে, জঘন্য পদ্ধতিগুলি সম্পর্কে পরিষ্কার থাকুন এবং অপারেটরগুলি এবং operatorফাংশনগুলি যেমন তাদের জন্য ডিজাইন করা হয়েছিল সেগুলি ব্যবহার করুন। পাইথনের যত্ন সহকারে শব্দার্থবিজ্ঞান রয়েছে যা এগুলি সরাসরি ডান্ডারকে সরাসরি কল করার চেয়ে জটিল। এখানে একটি উদাহরণ । সুতরাং, সংক্ষেপে, a.__add__(b)=> বিএডি; a + b=> ভাল।

  • কিছু উত্তর এখানে reduce(operator.add, [a, b])জোড়াযুক্ত যুক্তিযুক্ত প্রস্তাব করে - এটি sum([a, b], [])কেবলমাত্র আরও শব্দযুক্ত হিসাবে একই ।

  • যে কোনও পদ্ধতি ব্যবহার করে setতা সদৃশ এবং ড্রপ ক্রম হারাবে lose সতর্কতার সাথে ব্যবহার করুন.

  • for i in b: a.append(i)আরও শব্দযুক্ত এবং এর চেয়ে ধীর গতির a.extend(b), যা একক ফাংশন কল এবং আরও মূ id়। appendধীরে ধীরে শব্দার্থকগুলির কারণে ধাপে ধাপে স্মৃতি বরাদ্দ করা হয় এবং তালিকার জন্য বড় হয় grown অনুরূপ আলোচনার জন্য এখানে দেখুন ।

  • heapq.mergeকাজ করবে, তবে এর ব্যবহারের ক্ষেত্রে রৈখিক সময়ে সাজানো তালিকা মার্জ করার জন্য। অন্য যে কোনও পরিস্থিতিতে এটি ব্যবহার করা একটি অ্যান্টি-প্যাটার্ন।

  • yieldফাংশন থেকে তালিকাভুক্ত উপাদানগুলি একটি গ্রহণযোগ্য পদ্ধতি, তবে chainএটি দ্রুত এবং ভাল করে (এটি সিতে একটি কোড পাথ রয়েছে, তাই এটি দ্রুত)।

  • operator.add(a, b)এটি একটি গ্রহণযোগ্য কার্যকর সমতুল্য a + b। এটি ব্যবহারের ক্ষেত্রে মূলত গতিশীল পদ্ধতি প্রেরণের জন্য। অন্যথায়, পছন্দ করা a + bযা খাটো এবং আরো পাঠযোগ্য, আমার মতে । YMMV।


উত্তর stackoverflow.com/q/36863404/125507 একটি perfplot চক্রান্ত (numba সমাধান সহ) ব্যবহার করতে পারে
endolith

@ এন্ডোলিথ কিছুটা কাজ নিয়ে সরে গেছে তবে আমি একবার দেখে নেব এবং দেখি আমি চিপ করতে পারি কিনা y
সিএস 95

কর্মক্ষমতা অনুযায়ী দ্রুততম কোনটি সবচেয়ে ভাল পদ্ধতি? প্লিজ বলো.
গণেশदेशমুখ

@ বাগেশদেশেশমুখ টিএল; ডিআর হ'ল তারা সবাই ভাল আছেন এবং আপনি যেটি বেছে নেন তা বেশিরভাগ শৈলীর বিষয়। "There's not much difference between these methods but that makes sense given they all have the same order of complexity (linear). There's no particular reason to prefer one over the other except as a matter of style."সলিউশন আমার উত্তর তালিকাভুক্ত নয়, অথবা critized" মন্তব্য "আমি ব্যবহার করবেন সুপারিশ।
cs95


51

এই প্রশ্নটি দুটি তালিকায় যোগদানের বিষয়ে সরাসরি জিজ্ঞাসা করে। তবে আপনি অনেক তালিকায় যোগদানের উপায় খুঁজছেন এমন সময়েও এটি অনুসন্ধানে বেশ উচ্চ (

আমি মনে করি সবচেয়ে ভাল বিকল্পটি তালিকা বোধগম্যতা ব্যবহার করা:

>>> a = [[1,2,3], [4,5,6], [7,8,9]]
>>> [x for xs in a for x in xs]
[1, 2, 3, 4, 5, 6, 7, 8, 9]

আপনি জেনারেটরগুলিও তৈরি করতে পারেন:

>>> map(str, (x for xs in a for x in xs))
['1', '2', '3', '4', '5', '6', '7', '8', '9']

পুরানো উত্তর

এই আরও জেনেরিক পদ্ধতির বিবেচনা করুন:

a = [[1,2,3], [4,5,6], [7,8,9]]
reduce(lambda c, x: c + x, a, [])

আউটপুট দেবে:

[1, 2, 3, 4, 5, 6, 7, 8, 9]

মনে রাখবেন, এই এছাড়াও সঠিকভাবে কাজ করে যখন aহয় []বা [[1,2,3]]

তবে এটি আরও দক্ষতার সাথে করা যায় itertools:

a = [[1,2,3], [4,5,6], [7,8,9]]
list(itertools.chain(*a))

আপনার যদি প্রয়োজন না হয় listতবে কেবল একটি পুনরাবৃত্তিযোগ্য, বাদ দিন list()

হালনাগাদ

মন্তব্যে প্যাট্রিক কলিন্স দ্বারা প্রস্তাবিত বিকল্পটি আপনার পক্ষেও কাজ করতে পারে:

sum(a, [])

3
পাইথন 3 নোট: reduceএখন এতে রয়েছে functoolsতাই আপনাকে প্রথমে এটি আমদানি করতে হবে।
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

41

আপনি কেবল ব্যবহার করতে পারে +বা +=নিম্নরূপ অপারেটর:

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

c = a + b

বা:

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

c += (a + b)

এছাড়াও, আপনি যদি একীভূত তালিকার মানগুলি অনন্য হতে চান তবে আপনি এটি করতে পারেন:

c = list(set(a + b))

শেষ অংশটি নির্বিচারে আইটেমগুলি পুনরায় অর্ডার করতে পারে। আপনি যদি অর্ডার সংরক্ষণ করতে চান তবে সিপথন ৩.6++ আপনি করতে পারেনlist(dict.fromkeys(a + b))
বরিস

27

এটি লক্ষণীয় যে itertools.chainফাংশনটি পরিবর্তনশীল সংখ্যক আর্গুমেন্ট গ্রহণ করে:

>>> l1 = ['a']; l2 = ['b', 'c']; l3 = ['d', 'e', 'f']
>>> [i for i in itertools.chain(l1, l2)]
['a', 'b', 'c']
>>> [i for i in itertools.chain(l1, l2, l3)]
['a', 'b', 'c', 'd', 'e', 'f']

যদি কোনও পুনরাবৃত্ত (টিউপল, তালিকা, জেনারেটর ইত্যাদি) ইনপুট হয় তবে from_iterableশ্রেণি পদ্ধতিটি ব্যবহার করা যেতে পারে:

>>> il = [['a'], ['b', 'c'], ['d', 'e', 'f']]
>>> [i for i in itertools.chain.from_iterable(il)]
['a', 'b', 'c', 'd', 'e', 'f']

22

পাইথন ৩.৩+ এর মাধ্যমে আপনি এখান থেকে ফলন ব্যবহার করতে পারেন :

listone = [1,2,3]
listtwo = [4,5,6]

def merge(l1, l2):
    yield from l1
    yield from l2

>>> list(merge(listone, listtwo))
[1, 2, 3, 4, 5, 6]

বা, যদি আপনি পুনরাবৃত্তিকারীদের একটি নির্বিচার সংখ্যার সমর্থন করতে চান:

def merge(*iters):
    for it in iters:
        yield from it

>>> list(merge(listone, listtwo, 'abcd', [20, 21, 22]))
[1, 2, 3, 4, 5, 6, 'a', 'b', 'c', 'd', 20, 21, 22]

আপনি itertools.chainনিজের ফাংশনটি সংজ্ঞায়নের পরিবর্তে (যা সমান) ব্যবহার করতে পারেন ।
বরিস

18

আপনি যদি দুটি তালিকা সাজানো আকারে মার্জ করতে চান তবে আপনি লাইব্রেরি mergeথেকে ফাংশনটি ব্যবহার করতে পারেন heapq

from heapq import merge

a = [1, 2, 4]
b = [2, 4, 6, 7]

print list(merge(a, b))

15

আপনি যদি প্লাস অপারেটর ( +) ব্যবহার করতে না পারেন তবে আপনি operatorআমদানিটি ব্যবহার করতে পারেন :

import operator

listone = [1,2,3]
listtwo = [4,5,6]

result = operator.add(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

বিকল্পভাবে, আপনি __add__ ডেন্ডার ফাংশনটিও ব্যবহার করতে পারেন :

listone = [1,2,3]
listtwo = [4,5,6]

result = list.__add__(listone, listtwo)
print(result)

>>> [1, 2, 3, 4, 5, 6]

3
দন্ডগুলি দখল করা সাধারণত সর্বোত্তম পন্থা নয়। যদি +টেবিলটি বন্ধ থাকে তবে ব্যবহার করুন operator.add
দিমিত্রিস ফাসারাকিস হিলিয়ার্ড

2
প্লাস অপারেটরটি কেন অনুপলব্ধ থাকবে?
cs01

2
সাধারণত এটি হবে না :) তবে আপনি যদি মানচিত্রের ক্রিয়াকলাপের সাথে তালিকার সংমিশ্রণ করছেন বা অ্যাড ফাংশনটি একটি ভেরিয়েবলের মধ্যে সঞ্চয় করতে চান তবে আপনি + ব্যবহার করতে পারবেন না।
jpihl

13

আরও তালিকাগুলির আরও সাধারণ উপায় হিসাবে আপনি এগুলিকে একটি তালিকার মধ্যে রেখে দিতে পারেন এবং itertools.chain.from_iterable()1 টি ফাংশন ব্যবহার করতে পারেন যা এই উত্তরের ভিত্তিতে নেস্টেড তালিকার চাটুকার জন্য সেরা উপায়:

>>> l=[[1, 2, 3], [4, 5, 6], [7, 8, 9]]
>>> import itertools
>>> list(itertools.chain.from_iterable(l))
[1, 2, 3, 4, 5, 6, 7, 8, 9]

1. দ্রষ্টব্য যে chain.from_iterable()পাইথন ২.6 এবং তার পরে পাওয়া যায়। অন্যান্য সংস্করণে, ব্যবহার করুন chain(*l)


10

আপনার যদি জটিল বাছাইয়ের নিয়মগুলির সাথে দুটি আদেশযুক্ত তালিকার একত্রীকরণের প্রয়োজন হয় তবে আপনাকে এটিকে নীচের কোডের মতো নিজেকে রোল করতে হবে (পঠনযোগ্যতার জন্য একটি সাধারণ বাছাইয়ের নিয়ম ব্যবহার করে :-))।

list1 = [1,2,5]
list2 = [2,3,4]
newlist = []

while list1 and list2:
    if list1[0] == list2[0]:
        newlist.append(list1.pop(0))
        list2.pop(0)
    elif list1[0] < list2[0]:
        newlist.append(list1.pop(0))
    else:
        newlist.append(list2.pop(0))

if list1:
    newlist.extend(list1)
if list2:
    newlist.extend(list2)

assert(newlist == [1, 2, 3, 4, 5])

বা শুধু ব্যবহার heapq.merge
সিএস 95

7

আপনি অবজেক্টে append()সংজ্ঞায়িত পদ্ধতিটি ব্যবহার করতে পারেন list:

mergedlist =[]
for elem in listone:
    mergedlist.append(elem)
for elem in listtwo:
    mergedlist.append(elem)

9
ঠিক তাই আপনি জানেন, আপনি যদি বাস্তবে এটি করছেন তবে এটি অন্যান্য প্রস্তাবিত পদ্ধতির চেয়ে অনেক ধীর। দেখতে stackoverflow.com/questions/17479361/...
রায়ান Haining

7
list(set(listone) | set(listtwo))

উপরের কোডটি অর্ডার সংরক্ষণ করে না, প্রতিটি তালিকা থেকে সদৃশ সরিয়ে দেয় (তবে সংক্ষিপ্ত তালিকা থেকে নয়)


6

যেমন ইতিমধ্যে অনেকের দ্বারা ইঙ্গিত করা itertools.chain()হয়েছে, যদি উভয় তালিকায় যদি একইরূপ চিকিত্সা প্রয়োগ করতে হয় তবে সেই পথে যেতে হবে । আমার ক্ষেত্রে, আমার কাছে একটি লেবেল এবং একটি পতাকা ছিল যা একটি তালিকার চেয়ে অন্য তালিকার চেয়ে আলাদা ছিল, তাই আমার কিছুটা জটিল জটিল জিনিস দরকার হয়েছিল। দেখা যাচ্ছে, পর্দার আড়ালে itertools.chain()কেবল নিম্নলিখিতটি করা হয়:

for it in iterables:
    for element in it:
        yield element

( https://docs.python.org/2/library/itertools.html দেখুন ), তাই আমি এখান থেকে অনুপ্রেরণা নিয়েছি এবং এই লাইন বরাবর কিছু লিখেছি:

for iterable, header, flag in ( (newList, 'New', ''), (modList, 'Modified', '-f')):
    print header + ':'
    for path in iterable:
        [...]
        command = 'cp -r' if os.path.isdir(srcPath) else 'cp'
        print >> SCRIPT , command, flag, srcPath, mergedDirPath
        [...]

এখানে বোঝার মূল বিষয়গুলি হ'ল তালিকাগুলি কেবল পুনরাবৃত্তির একটি বিশেষ ক্ষেত্রে, যা অন্য যে কোনও বস্তুর মতো; এবং for ... inপাইথনের লুপগুলি টুপল ভেরিয়েবলগুলির সাথে কাজ করতে পারে, তাই একই সাথে একাধিক ভেরিয়েবলের লুপ করা সহজ।


5

একটি সাধারণ তালিকা উপলব্ধি ব্যবহার করুন:

joined_list = [item for list_ in [list_one, list_two] for item in list_]

অতিরিক্ত আনপ্যাকিং জেনারালাইজেশন ব্যবহার করার নতুন পদ্ধতির সমস্ত সুবিধা রয়েছে - যেমন আপনি বিভিন্ন পুনরাবৃত্তকারীগুলির (যেমন, তালিকা, টিপলস, ব্যাপ্তি এবং জেনারেটর) সেভাবে স্বেচ্ছাসেবী সংখ্যাটি একত্রিত করতে পারেন - এবং এটি পাইথন 3.5 বা তার পরে সীমাবদ্ধ নয় not ।


4

তালিকার তালিকার সংমিশ্রণের একটি খুব সংক্ষিপ্ত উপায়

list_of_lists = [[1,2,3], [4,5,6], [7,8,9]]
reduce(list.__add__, list_of_lists)

যা আমাদের দেয়

[1, 2, 3, 4, 5, 6, 7, 8, 9]

পরিবর্তে ব্যবহার করবেন না list.__add__, দয়া operator.addকরে। এটি আরও শব্দযুক্ত সমতুল্য sum(list_of_lists, [])যা ঠিক ততটাই খারাপ। ব্যবহার করবেন না!
সিএস 95

@ সিএস 95 আপনি তালিকাটি ব্যবহার করে সমস্যাটি কী তা ব্যাখ্যা করতে পারেন __ যোগ__
আকাশ সিং

ডিণ্ডার পদ্ধতিগুলি "ব্যক্তিগত পদ্ধতি" এবং সাধারণত সরাসরি ব্যবহার করা উচিত নয় (এগুলি অন্যান্য ফাংশন দ্বারা ডাকা হয়)। ব্যতিক্রম obj.__class__এবং হয় obj.__dict__
সিএস 95

3

পাইথনে আপনি এই কমান্ডের সাথে সুসংগত মাত্রার দুটি অ্যারে সংযুক্ত করতে পারেন

numpy.concatenate([a,b])

4
প্রশ্নটি অলস জন্য জিজ্ঞাসা করে না।
সিএস 95

2

সুতরাং দুটি সহজ উপায় আছে।

  1. ব্যবহার+ : এটি সরবরাহিত তালিকা থেকে একটি নতুন তালিকা তৈরি করে

উদাহরণ:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: a + b
Out[3]: [1, 2, 3, 4, 5, 6]

In [4]: %timeit a + b
10000000 loops, best of 3: 126 ns per loop
  1. প্রসারিত ব্যবহার : এটি বিদ্যমান তালিকায় নতুন তালিকা যুক্ত করে। তার মানে এটি আলাদা তালিকা তৈরি করে না।

উদাহরণ:

In [1]: a = [1, 2, 3]

In [2]: b = [4, 5, 6]

In [3]: %timeit a.extend(b)
10000000 loops, best of 3: 91.1 ns per loop

সুতরাং আমরা দেখতে পাচ্ছি যে দুটি জনপ্রিয় পদ্ধতির মধ্যে দুটি extendকার্যকর is


2
আমার যদি একাধিক তালিকাগুলি যেমন + বি + সি + ডি + ই যুক্ত করতে হয় তবে কী হবে?
টুইটকিম্প

2
@ টুইকিম্প এই উত্তরটি দেখুন যাতে কয়েকটি বিকল্প রয়েছে (আমি প্রস্তাব দিই chain.from_iterable)।
সিএস 95

2

পাইথনের তালিকাগুলি সংঘবদ্ধ করার একাধিক উপায় রয়েছে।

l1 = [1,2,3,4]
l2 = [3,4,5,6]

1. new_list = l1.extend(l2)
2. new_list = l1 + l2
3. new_list = [*l1, *l2]

1
আপনি দয়া করে ব্যাখ্যা করতে পারেন যে এই উত্তরটি অন্যদের জন্য কী নতুন তথ্য সরবরাহ করে?
CS95

পাইথনের তালিকাগুলি সংঘবদ্ধ করার একাধিক উপায় রয়েছে - যা সমস্ত অন্যান্য পুরানো উত্তরে বিস্তৃতভাবে আবৃত। এটি কোন নতুন তথ্য সরবরাহ করে ??
টমেরিকু

-1
import itertools

A = list(zip([1,3,5,7,9],[2,4,6,8,10]))
B = [1,3,5,7,9]+[2,4,6,8,10]
C = list(set([1,3,5,7,9] + [2,4,6,8,10]))

D = [1,3,5,7,9]
D.append([2,4,6,8,10])

E = [1,3,5,7,9]
E.extend([2,4,6,8,10])

F = []
for a in itertools.chain([1,3,5,7,9], [2,4,6,8,10]):
    F.append(a)


print ("A: " + str(A))
print ("B: " + str(B))
print ("C: " + str(C))
print ("D: " + str(D))
print ("E: " + str(E))
print ("F: " + str(F))

আউটপুট:

A: [(1, 2), (3, 4), (5, 6), (7, 8), (9, 10)]
B: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
C: [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
D: [1, 3, 5, 7, 9, [2, 4, 6, 8, 10]]
E: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]
F: [1, 3, 5, 7, 9, 2, 4, 6, 8, 10]

-1

আপনি যদি দুটি পুরানো তালিকাগুলি রেখে নতুন তালিকা চান:

def concatenate_list(listOne, listTwo):
    joinedList = []
    for i in listOne:
        joinedList.append(i)
    for j in listTwo:
        joinedList.append(j)

    sorted(joinedList)

    return joinedList

মিঙ্গসিয়াও এই উত্তর থেকে কীভাবে আলাদা ?
টমেরিকু

-2
lst1 = [1,2]

lst2 = [3,4]

def list_combinationer(Bushisms, are_funny):

    for item in lst1:
        lst2.append(item)
        lst1n2 = sorted(lst2)
        print lst1n2

list_combinationer(lst1, lst2)

[1,2,3,4]

4
ঠিক আছে, দয়া করে কিছু ব্যাখ্যা করুন
ইউ 10-ফরওয়ার্ড

আপনি যদি এর অভ্যন্তরে বিশ্বব্যাপী নামগুলি ব্যবহার করেন তবে ফাংশনটির যুক্তিগুলির মূল বিষয়টি কী?
টমেরিকু

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