2 টি তালিকার মূল উপাদান যুক্ত?


244

আমার এখন আছে:

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

আমি চাই:

[1, 2, 3]
 +  +  +
[4, 5, 6]
|| || ||
[5, 7, 9]

কেবলমাত্র দুটি তালিকার একটি উপাদান অনুসারে সংযোজন।

আমি অবশ্যই দুটি তালিকা পুনরাবৃত্তি করতে পারি, তবে আমি এটি করতে চাই না।

এটি করার সর্বাধিক পাইথোনিক উপায় কী ?


উত্তর:


364

ব্যবহার করুন mapসঙ্গে operator.add:

>>> from operator import add
>>> list( map(add, list1, list2) )
[5, 7, 9]

বা zipএকটি তালিকা বোধগম্যতা সহ:

>>> [sum(x) for x in zip(list1, list2)]
[5, 7, 9]

সময় তুলনা:

>>> list2 = [4, 5, 6]*10**5
>>> list1 = [1, 2, 3]*10**5
>>> %timeit from operator import add;map(add, list1, list2)
10 loops, best of 3: 44.6 ms per loop
>>> %timeit from itertools import izip; [a + b for a, b in izip(list1, list2)]
10 loops, best of 3: 71 ms per loop
>>> %timeit [a + b for a, b in zip(list1, list2)]
10 loops, best of 3: 112 ms per loop
>>> %timeit from itertools import izip;[sum(x) for x in izip(list1, list2)]
1 loops, best of 3: 139 ms per loop
>>> %timeit [sum(x) for x in zip(list1, list2)]
1 loops, best of 3: 177 ms per loop

10
আপনি যদি এই বিশাল অ্যারেগুলি ব্যবহার করেন তবে @ বাসসুইঙ্কেলস দ্বারা নির্লজ্জ সমাধান সম্ভবত এমন কিছু যা আপনার দিকে নজর দেওয়া উচিত।
হেনরি গোমারসাল

1
এই সময়ের জন্য আপনি কী পাইথন সংস্করণ ব্যবহার করেছেন?
আরশাজি

9
এনবি - পাইথন 3 এ, মানচিত্র () একটি তালিকার পরিবর্তে পুনরাবৃত্তিযোগ্য জিনিসে ফিরে আসে। আপনার যদি সত্যিকারের তালিকার প্রয়োজন হয় তবে প্রথম উত্তরটি হ'ল তালিকা (মানচিত্র (যোগ করুন, তালিকা 1, তালিকা 2))
এফএলহর্ন

@FLHerne দ্বারা উল্লিখিত পাইথন 3 ইস্যুটি পর্যালোচনা করা সময়ের সাথে সাথে mapআরও গুরুত্বপূর্ণ হয়ে উঠবে। পাইথন 2 3 বছরেরও কম সময়ে অফিসিয়াল সমর্থন হারাবে।
nealmcb

1
অনেক সময় রয়েছে অজগর সিনট্যাক্স সত্যই মার্জিত এবং সহজ, কিন্তু দুর্ভাগ্যক্রমে এটি তাদের মধ্যে একটি নয় isn't এবং এই জাতীয় একটি সহজ কাজের জন্য, এটি একটি করুণা .... ইতিমধ্যে যখনই "এক্সটেন্ড" () পদ্ধতি আছে তখন তারা কেন তালিকাগুলির সাথে মিলিত করবে?
নিক স্কোজজারো

105

খাঁটি অজগরটিতে এটি কীভাবে করা যায় তা অন্যরা উদাহরণ দিয়েছিল। আপনি যদি 100.000 উপাদানগুলির সাথে অ্যারে দিয়ে এটি করতে চান তবে আপনার অলপ ব্যবহার করা উচিত:

In [1]: import numpy as np
In [2]: vector1 = np.array([1, 2, 3])
In [3]: vector2 = np.array([4, 5, 6])

উপাদান অনুসারে সংযোজন করা এখন তত তুচ্ছ

In [4]: sum_vector = vector1 + vector2
In [5]: print sum_vector
[5 7 9]

মতলবের মতোই।

অশ্বিনীর দ্রুততম সংস্করণটির সাথে তুলনা করার সময়:

In [16]: from operator import add
In [17]: n = 10**5
In [18]: vector2 = np.tile([4,5,6], n)
In [19]: vector1 = np.tile([1,2,3], n)
In [20]: list1 = [1,2,3]*n
In [21]: list2 = [4,5,6]*n
In [22]: timeit map(add, list1, list2)
10 loops, best of 3: 26.9 ms per loop

In [23]: timeit vector1 + vector2
1000 loops, best of 3: 1.06 ms per loop

সুতরাং এটি একটি ফ্যাক্টর 25 দ্রুত! তবে আপনার পরিস্থিতি অনুসারে ব্যবহার করুন। একটি সাধারণ প্রোগ্রামের জন্য, আপনি সম্ভবত নিম্প ইনস্টল করতে চান না, সুতরাং স্ট্যান্ডার্ড পাইথন ব্যবহার করুন (এবং আমি হেনরির সংস্করণটি পাইথোনিকের সর্বাধিক সন্ধান করি)। আপনি যদি গুরুতর সংখ্যায় ক্রাঞ্চিংয়ের মধ্যে থাকেন numpyতবে ভারী উত্তোলন করতে দিন । গতি শৌখিনতার জন্য: দেখে মনে হচ্ছে অসাড় সমাধানটি দ্রুতই শুরু হয়ে গেছে n = 8


59
[a + b for a, b in zip(list1, list2)]

4
@ দালতাব গৃহীত উত্তরটি দ্রুততর এবং এতে এই উত্তর রয়েছে (আরও তথ্যপূর্ণ)
সিবস জুয়া

2
@ পারফেকশন এম 1 এং যদিও আমি আপনার বিষয়টি বুঝতে পেরেছি (এবং এটির চেয়ে কিছুটা বিবেচনাও করবেন না) আমি কেবল ভেবেছিলাম যে আমি যে সমাধানটি উপস্থাপন করেছি তা আমি সর্বদা ব্যবহার করব (যা দেওয়া হলেও এর জন্য কোনও আমদানির প্রয়োজন হয় না তর্কাতীতভাবে সহজতমও হয়) তর্কসাপেক্ষভাবে আরও অজগর হিসাবে), বা যেখানে গতি গণনা করা হয়েছে, বাস সুইঙ্কেলের উত্তর , যা গতির বিষয়টি বিবেচনা করে অতিমাত্রায় সঠিক বিকল্প।
হেনরি গোমারসাল

হ্যাঁ. মতামত জন্য ধন্যবাদ। তবে মূলত [sum(x) for x in zip(list1, list2)]আপনার উত্তর হিসাবে একই, তাই না? :)
সিবস জুয়া

4
@ perfectionm1ng কম বা কম (যদিও এটি আমার পরে একটি সম্পাদনা যুক্ত করা হয়েছে :)। ব্যক্তিগতভাবে, আমি পঠনযোগ্যতা এবং অজগরের জন্য সুস্পষ্ট টিপল আনপ্যাকিংয়ের সাথে + বি সংকেতটি পছন্দ করি।
হেনরি গোমারসাল

12

অন্যদের দ্বারা বর্ণিত হিসাবে, একটি দ্রুত এবং এছাড়াও স্থান দক্ষ সমাধানটি বিল্ট-ইন ভেক্টর ম্যানিপুলেশন সক্ষমতা সহ নিমপি (এনপি) ব্যবহার করছে:

1. নম্পি সহ

x = np.array([1,2,3])
y = np.array([2,3,4])
print x+y

2. অন্তর্নির্মিত সহ

২.১ লাম্বদা

list1=[1, 2, 3]
list2=[4, 5, 6]
print map(lambda x,y:x+y, list1, list2)

লক্ষ্য করুন যে মানচিত্রটি () একাধিক যুক্তি সমর্থন করে।

২.২ জিপ এবং তালিকা উপলব্ধি

list1=[1, 2, 3]
list2=[4, 5, 6]
print [x + y for x, y in zip(list1, list2)]

1
ল্যাম্বদা পদ্ধতির জন্য +1। এটি লজ্জার বিষয় যে এই সমাধানটি অন্য সমাধানগুলির সাথে মিলিত হয়েছে যা অন্য কোথাও সদৃশ।
লন্ডনরব

10

numpyআমার মতামত থেকে এটি ব্যবহার করা সহজ :

import numpy as np
list1=[1,2,3]
list2=[4,5,6]
np.add(list1,list2)

ফলাফল:

টার্মিনাল এক্সিকিউশন

বিশদ পরামিতি তথ্যের জন্য, এখানে চেক করুন: numpy.add


6

সম্ভবত "সর্বাধিক পাইথোনিক উপায়ে" কেস পরিচালনা করা অন্তর্ভুক্ত করা উচিত যেখানে তালিকা 1 এবং তালিকা 2 একই আকার নয়। এই কয়েকটি পদ্ধতির প্রয়োগ করা নিঃশব্দে আপনাকে একটি উত্তর দেবে। ন্যালি অ্যাপ্রোচ আপনাকে জানাতে দেবে, সম্ভবত একটি ভ্যালুআরারের সাথে।

উদাহরণ:

import numpy as np
>>> list1 = [ 1, 2 ]
>>> list2 = [ 1, 2, 3]
>>> list3 = [ 1 ]
>>> [a + b for a, b in zip(list1, list2)]
[2, 4]
>>> [a + b for a, b in zip(list1, list3)]
[2]
>>> a = np.array (list1)
>>> b = np.array (list2)
>>> a+b
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
ValueError: operands could not be broadcast together with shapes (2) (3)

এটি আপনার সমস্যার কোনও ফাংশনে থাকলে আপনি কোন ফলাফলটি পেতে চাইতে পারেন?


এই ক্ষেত্রে এক স্পষ্টভাবে মধ্যে হওয়া উচিত zip_longestএকটি সঙ্গে itertools থেকে fillvalueএর 0
এম


5

এটি 2 বা ততোধিক তালিকার জন্য কাজ করবে; তালিকাগুলির তালিকাগুলির মাধ্যমে পুনরাবৃত্তি করা, তবে প্রতিটি তালিকার উপাদানগুলির সাথে কাজ করার জন্য নমপি সংযোজন ব্যবহার করা

import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]

lists = [list1, list2]
list_sum = np.zeros(len(list1))
for i in lists:
   list_sum += i
list_sum = list_sum.tolist()    

[5.0, 7.0, 9.0]

5

আপনার অজানা তালিকা রয়েছে এবং কিছু আমদানি না করেই সম্ভবত এটি অজগর এবং কিছুটা কার্যকর।

যতক্ষণ না তালিকাগুলি একই দৈর্ঘ্যের হয়, আপনি নীচের ফাংশনটি ব্যবহার করতে পারেন।

এখানে * আরগগুলি তালিকাভুক্ত আর্গুমেন্টগুলির একটি পরিবর্তনশীল সংখ্যার গ্রহণ করে (তবে কেবল প্রতিটিটিতে একই সংখ্যার উপাদানগুলির যোগফল থাকে)।

* প্রতিটি তালিকার প্রতিটি উপাদানকে আনপ্যাক করার জন্য প্রত্যাবর্তিত তালিকায় আবার ব্যবহার করা হয়।

def sum_lists(*args):
    return list(map(sum, zip(*args)))

a = [1,2,3]
b = [1,2,3]  

sum_lists(a,b)

আউটপুট:

[2, 4, 6]

অথবা 3 টি তালিকা সহ

sum_lists([5,5,5,5,5], [10,10,10,10,10], [4,4,4,4,4])

আউটপুট:

[19, 19, 19, 19, 19]

3

ল্যাম্বদা ফাংশন সহ মানচিত্রটি ব্যবহার করুন:

>>> map(lambda x, y: x + y, list1, list2)
[5, 7, 9]

3

আমি এটির সময় নিই নি তবে আমার সন্দেহ হয় এটি খুব দ্রুত হবে:

import numpy as np
list1=[1, 2, 3]
list2=[4, 5, 6]

list_sum = (np.add(list1, list2)).tolist()

[5, 7, 9]

3

আপনার যদি বিভিন্ন আকারের তালিকা পরিচালনা করতে হয় তবে চিন্তা করবেন না! বিস্ময়কর itertools মডিউল আপনি কভার করেছেন:

>>> from itertools import zip_longest
>>> list1 = [1,2,1]
>>> list2 = [2,1,2,3]
>>> [sum(x) for x in zip_longest(list1, list2, fillvalue=0)]
[3, 3, 3, 3]
>>>

পাইথন 2 zip_longestএ বলা হয় izip_longest

এই প্রাসঙ্গিক উত্তরটি দেখুন এবং অন্য একটি প্রশ্নে মন্তব্য করুন



2

যদিও, ফলাফল উত্পন্ন করতে প্রকৃত প্রশ্ন তালিকার উপরে পুনরাবৃত্তি করতে চায় না, তবে প্রস্তাবিত সমস্ত সমাধান হুডের নীচে ঠিক এমনটি করে!

রিফ্রেশ করার জন্য: সমস্ত ভেক্টর উপাদানগুলিকে না দেখে আপনি দুটি ভেক্টর যুক্ত করতে পারবেন না। সুতরাং, এই সমাধানগুলির বেশিরভাগ অ্যালগোরিদমিক জটিলতা হ'ল বিগ-ও (এন)। যেখানে এন ভেক্টরের মাত্রা।

সুতরাং, একটি অ্যালগরিদমিক দৃষ্টিকোণ থেকে, লুপের জন্য ব্যবহার করে ফলাফলগুলি পুনরায় তৈরি করতে পুনরায় তৈরি হওয়া ফলাফলটি যৌক্তিক এবং পাইথোনিকও। যাইহোক, অতিরিক্ত হিসাবে, এই পদ্ধতিতে কোনও অতিরিক্ত পাঠাগার কল করতে বা আমদানির ওভারহেড থাকে না।

# Assumption: The lists are of equal length.
resultList = [list1[i] + list2[i] for i in range(len(list1))]

এখানে যে সময়গুলি প্রদর্শিত / আলোচনা করা হচ্ছে তা সিস্টেম এবং বাস্তবায়ন নির্ভর, এবং অপারেশনের দক্ষতা পরিমাপের জন্য নির্ভরযোগ্য পরিমাপ হতে পারে না। যে কোনও ক্ষেত্রে, ভেক্টর সংযোজন অপারেশনের বড় ও জটিলতা লিনিয়ার, যার অর্থ ও (এন)।


1
a_list = []
b_list = []
for i in range(1,100):
    a_list.append(random.randint(1,100))

for i in range(1,100):
    a_list.append(random.randint(101,200))
[sum(x) for x in zip(a_list , b_list )]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.