পাইথন উপাদান-ভিত্তিক টুপল অপারেশনগুলি যোগফলের মতো


102

পাইথনে টুপল অপারেশনগুলি কীভাবে এইভাবে কাজ করতে পাওয়া যায়:

>>> a = (1,2,3)
>>> b = (3,2,1)
>>> a + b
(4,4,4)

পরিবর্তে:

>>> a = (1,2,3)
>>> b = (3,2,1)
>>> a + b
(1,2,3,3,2,1)

আমি জানি যে এটি এর মতো কাজ করে কারণ পদ্ধতিগুলি __add__এবং __mul__সেগুলির মতো কাজ করার জন্য সংজ্ঞায়িত করা হয়। সুতরাং একমাত্র উপায় তাদের নতুন সংজ্ঞা দেওয়া হবে?

উত্তর:


138
import operator
tuple(map(operator.add, a, b))

4
আমি বলব এটি সবচেয়ে অজগর সমাধান solution
ম্যাথু শিনকেল

4
সেই মানচিত্র বাদে () আধা-অবহিত। গাইডোর একটি নিবন্ধের জন্য artima.com/weblogs/viewpost.jsp?thread=98196 দেখুন যেখানে এটি তালিকা বোঝার হিসাবে কীভাবে মানচিত্রকে আরও ভালভাবে লেখা যায় তা উল্লেখ করে।
অ্যাডাম পার্কিন

যদি & বি তে একই সংখ্যক উপাদান না থাকে বা "যোগযোগ্য" না হয় তবে এটিও ফুঁড়ে উঠবে (উদা:map(operator.add, (1,2), ("3", "4"))
অ্যাডাম পার্কিন

24
tuple([item1 + item2 for item1, item2 in zip(a, b)])একটি তালিকা বোধগম্য হিসাবে সমতুল্য হবে।
অ্যাডাম পার্কিন

13
@ অ্যাডাম পারকিন, জেনারেটর বোঝাপড়া আরও ভাল tuple(item1 + item2 for item1, item2 in zip(a, b))
ক্রিশ্চিয়ান সিপিতু

120

সমস্ত বিল্ট-ইন ব্যবহার করে ..

tuple(map(sum, zip(a, b)))

4
এটি সহজ, সর্বোত্তম উত্তর বলে মনে হচ্ছে। কেন এটি গৃহীত হয় না?
মার্ক কেনেডেলা

15
এটি ভাল, তবে প্রযুক্তিগতভাবে যা জিজ্ঞাসা করা হয়নি তা নয় কারণ মানচিত্রটি একটি তালিকার পরিবর্তে একটি তালিকা দেয় ... তাই:tuple(map(sum,zip(a,b))
বেন

4
বাক্য গঠনটি মরমী।
অ্যানাটোলি টেকটোনিক

4
এর একটিটির সুবিধাটি হ'ল আপনি এটিকে প্রসারিত করতে পারেন:tuple(map(sum,zip(a,b, c))
অ্যান্ডি হেডেন


20

আয়রনফ্রোগির কোডে একটি টুইটের সাহায্যে প্রথম দুটি উত্তরগুলির বাছাই করুন যাতে এটি একটি টিপল দেয়:

import operator

class stuple(tuple):
    def __add__(self, other):
        return self.__class__(map(operator.add, self, other))
        # obviously leaving out checking lengths

>>> a = stuple([1,2,3])
>>> b = stuple([3,2,1])
>>> a + b
(4, 4, 4)

দ্রষ্টব্য: সাবক্লাসিং সহজ করার self.__class__পরিবর্তে ব্যবহার করা stuple


18
from numpy import array

a = array( [1,2,3] )
b = array( [3,2,1] )

print a + b

দেয় array([4,4,4])

Http://www.scipy.org/Tentative_NumPy_Tutorial দেখুন


9
এটি কাজ করবে, তবে কেবল একটি সাধারণ সংযোজন ক্রিয়াকলাপের জন্য নিম্পি আমদানি করা কিছুটা ভারী।

11

জেনারেটর উপলব্ধি মানচিত্রের পরিবর্তে ব্যবহার করা যেতে পারে। অন্তর্নির্মিত মানচিত্রের কার্যটি অপ্রচলিত নয় তবে তালিকা / জেনারেটর / ডিক বোঝার তুলনায় এটি বেশিরভাগ লোকের পক্ষে কম পঠনযোগ্য, তাই আমি সাধারণভাবে মানচিত্রের ফাংশনটি ব্যবহার না করার পরামর্শ দেব।

tuple(p+q for p, q in zip(a, b))

6

ক্লাস সংজ্ঞা ছাড়াই সহজ সমাধান যা দ্বিগুণ হয়

import operator
tuple(map(operator.add,a,b))

6

সমস্ত জেনারেটর সমাধান। কর্মক্ষমতা সম্পর্কে নিশ্চিত নয় (যদিও এররোলগুলি দ্রুত, যদিও)

import itertools
tuple(x+y for x, y in itertools.izip(a,b))

3

হ্যাঁ. তবে আপনি অন্তর্নির্মিত ধরণের পুনরায় সংজ্ঞা দিতে পারবেন না। আপনাকে সেগুলি সাবক্লাস করতে হবে:

ক্লাস MyTuple (টিপল):
    ডিএফ __ অ্যাড __ (স্ব, অন্যান্য):
         যদি লেন (স্ব)! = লেন (অন্যান্য):
             মান বাড়ান ("টিপল দৈর্ঘ্য মেলে না")
         জিপতে মাইটিআপল (x + y এর জন্য (x, y) ফেরত দিন)

তবে তারপরে আপনি টুপল সিনট্যাক্সটি ব্যবহার করতে পারবেন না।
এয়ারপোর্টে


1

আমি বর্তমানে ওভারলোড +, - এবং * "টিপল" ক্লাসটি সাবক্লাস করছি। আমি এটি কোডটি সুন্দর এবং কোড লেখা সহজ করে দেখছি।

class tupleN(tuple):
    def __add__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x+y for x,y in zip(self,other))
    def __sub__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x-y for x,y in zip(self,other))
    def __mul__(self, other):
        if len(self) != len(other):
             return NotImplemented
        else:
             return tupleN(x*y for x,y in zip(self,other))


t1 = tupleN((1,3,3))
t2 = tupleN((1,3,4))
print(t1 + t2, t1 - t2, t1 * t2, t1 + t1 - t1 - t1)
(2, 6, 7) (0, 0, -1) (1, 9, 12) (0, 0, 0)

-1

ক্ষেত্রে কারও টিউপসগুলির একটি গড় গড় প্রয়োজন:

import operator 
from functools import reduce
tuple(reduce(lambda x, y: tuple(map(operator.add, x, y)),list_of_tuples))
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.