পাইথনে 2 টি তালিকা বিয়োগ করা হচ্ছে


86

এই মুহুর্তে আমার কাছে ভেক্টর 3 মান তালিকা হিসাবে উপস্থাপিত হয়েছে। এর মতো ভেক্টর 3 মানগুলির মতো 2 টি বিয়োগ করার কোনও উপায় আছে?

[2,2,2] - [1,1,1] = [1,1,1]

আমার কি টিপলস ব্যবহার করা উচিত?

যদি তাদের মধ্যে কেউ এই ধরণের অপারেশনগুলি সংজ্ঞায়িত না করে তবে আমি কী পরিবর্তে এটি সংজ্ঞায়িত করতে পারি?

যদি তা না হয় তবে আমি কি নতুন ভেক্টর 3 ক্লাস তৈরি করব?

উত্তর:


135

আপনি যদি প্রায়শই এই কাজটি করতে থাকেন এবং বিভিন্ন ক্রিয়াকলাপ দিয়ে থাকেন তবে আপনার সম্ভবত সম্ভবত এই জাতীয় কেসগুলি পরিচালনা করতে একটি ক্লাস তৈরি করা উচিত, বা নম্পির মতো কিছু লাইব্রেরি আরও ভালভাবে ব্যবহার করা উচিত

অন্যথায়, জিপ বিল্টিন ফাংশনটির সাথে ব্যবহৃত তালিকা বোধের জন্য সন্ধান করুন :

[a_i - b_i for a_i, b_i in zip(a, b)]

83

বোধগম্য তালিকা তালিকার একটি বিকল্প এখানে। মানচিত্র তালিকা (গুলি) (পরে আর্গুমেন্ট) এর মাধ্যমে পুনরাবৃত্তি করে একযোগে এটি করে এবং তাদের উপাদানগুলি আর্গুমেন্ট হিসাবে ফাংশনে (প্রথম আরগ) পাস করে। এটি ফলাফলের তালিকাটি ফিরিয়ে দেয়।

import operator
map(operator.sub, a, b)

এই কোডটি কম সিনট্যাক্স রয়েছে (যা আমার জন্য আরও নান্দনিক), এবং স্পষ্টতই এটি দৈর্ঘ্য 5 এর তালিকার জন্য 40% দ্রুত (বোবিন্সের মন্তব্য দেখুন)। তবুও, উভয় সমাধান কাজ করবে।


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

4
পাঁচটি-উপাদান বিয়োগের জন্য পাইপ 6-এ আমার কাছে মানচিত্রটি প্রায় 40% দ্রুত বেরিয়ে আসে out বিবেচনাগুলি আরও নতুন এবং ক্লিনার যেখানে তারা ল্যাম্বডা এড়ায়, তবে বিদ্যমান ফাংশনগুলির মানচিত্র ম্যাপ করার জন্য এখনও সুন্দর হতে পারে ... বিশেষত এখানে যেখানে আপনি বিল্ট-ইন জিপটি অর্জন করতে পারেন।
ববিনস

4
এটি অ্যারে.আরয়ের জন্যও কাজ করে (যদিও ফলাফলটি একটি তালিকা)
জিনগুলি

6
'ইম্পোর্ট অপারেটর' ধারা প্রয়োজন; int .__ উপ__ কৌশলটি আরও ভাল করে))
গেরেজ

13

যদি আপনার তালিকাগুলি a এবং b হয় তবে আপনি এটি করতে পারেন:

map(int.__sub__, a, b)

তবে আপনার সম্ভবত করা উচিত নয়। এর অর্থ কী তা কেউ জানতে পারবে না।


4
ভাসতে ভাসতে এই আমি নিজেই। যে ক্ষেত্রে map(float.__sub__, a, b)কাজ করে। বখশিশের জন্য ধন্যবাদ!
S3DEV

9

আমি সুপারিশ করতে চাই NumPy পাশাপাশি

ভেক্টর গণিত করার জন্য এটি কেবল দ্রুত নয়, এটির সুবিধামত কার্যকারিতাও রয়েছে।

আপনি যদি 1 ডি ভেক্টরগুলির জন্য আরও দ্রুত কিছু করতে চান তবে ভপ চেষ্টা করুন

এটি ম্যাটল্যাবের মতো, তবে বিনামূল্যে এবং স্টাফ। আপনি যা করতে চান তার একটি উদাহরণ এখানে

from numpy import matrix
a = matrix((2,2,2))
b = matrix((1,1,1))
ret = a - b
print ret
>> [[1 1 1]]

বুম।


4
np.arrayএকটি সহজ সমাধান হতে পারে
garej



4

কিছুটা আলাদা ভেক্টর শ্রেণি।

class Vector( object ):
    def __init__(self, *data):
        self.data = data
    def __repr__(self):
        return repr(self.data) 
    def __add__(self, other):
        return tuple( (a+b for a,b in zip(self.data, other.data) ) )  
    def __sub__(self, other):
        return tuple( (a-b for a,b in zip(self.data, other.data) ) )

Vector(1, 2, 3) - Vector(1, 1, 1)

3

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

পাইথনে গণিত থেকে নেওয়া :

class Vector:

  def __init__(self, data):
    self.data = data

  def __repr__(self):
    return repr(self.data)  

  def __add__(self, other):
    data = []
    for j in range(len(self.data)):
      data.append(self.data[j] + other.data[j])
    return Vector(data)  

x = Vector([1, 2, 3])    
print x + x

2

যিনি পাইচার্মে কোড ব্যবহার করতেন, তার জন্য এটি অন্যকেও জীবিত করে।

 import operator
 Arr1=[1,2,3,45]
 Arr2=[3,4,56,78]
 print(list(map(operator.sub,Arr1,Arr2)))

1

পাইথনের মধ্যে mapএবং lambdaফাংশনগুলির সংমিশ্রণ এই ধরণের সমস্যার জন্য ভাল সমাধান:

a = [2,2,2]
b = [1,1,1]
map(lambda x,y: x-y, a,b)

zip @UncleZeiv দ্বারা প্রদর্শিত হিসাবে ফাংশন, আরও ভাল পছন্দ is


0
arr1=[1,2,3]
arr2=[2,1,3]
ls=[arr2-arr1 for arr1,arr2 in zip(arr1,arr2)]
print(ls)
>>[1,-1,0]

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

0

এই উত্তরটি দেখায় কীভাবে পাইথোনিক কোডটি "স্বাভাবিক / সহজে বোধগম্য" লিখতে হয়।

আমি zipএটির মতো ব্যবহার না করার পরামর্শ দিচ্ছি যা সবাই এর সম্পর্কে জানে না।


সমাধানগুলি তালিকা বোধগম্য এবং সাধারণ অন্তর্নির্মিত ফাংশনগুলি ব্যবহার করে।


বিকল্প 1 (প্রস্তাবিত):

a = [2, 2, 2]
b = [1, 1, 1]
result = [a[i] - b[i] for i in range(len(a))]

প্রস্তাবিত এটি কেবল পাইথনের সর্বাধিক প্রাথমিক কার্যাদি ব্যবহার করে


বিকল্প 2:

a = [2, 2, 2]
b = [1, 1, 1]
result = [x - b[i] for i, x in enumerate(a)]

বিকল্প 3 ( বায়ো কোডার দ্বারা উল্লিখিত ):

a = [2, 2, 2]
b = [1, 1, 1]
result = list(map(lambda x, y: x - y, a, b))

ডাউনটা কেন? আমার উত্তরটি অনন্য, এবং অন্যের পক্ষে সহায়ক হতে পারে।
টিমি চ্যান

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