“|” ব্যবহার না করে কীভাবে এক লাইনে দুটি সেট যুক্ত করবেন


171

ধরুন Sএবং Tসেট বরাদ্দ করা হয়েছে। জয়েন অপারেটরটি ব্যবহার না করে |আমি কীভাবে দুটি সেটগুলির মিলন খুঁজে পেতে পারি? এটি উদাহরণস্বরূপ, ছেদটি আবিষ্কার করে:

S = {1, 2, 3, 4}
T = {3, 4, 5, 6}
S_intersect_T = { i for i in S if i in T }

সুতরাং আমি কীভাবে ব্যবহার না করে এক লাইনে দুটি সেট এর মিলন খুঁজে পেতে পারি |?


1
তোমার কি মিলন দরকার? যদি হ্যাঁ তবে আপনি s.union (টি) করতে পারেন
আনসুমান বেবার্তা

59
আপনি কেন ব্যবহার করতে পারবেন না |?
স্কট বারটেল

1
কোন জেনেরিক কারণ ব্যবহার না করা |?
ম্যাটানস্টার

5
একটি কারণ হতে পারে একটি ফাংশন আর্গুমেন্ট হিসাবে একটি সেট অপারেশন পাস। একটি ফাংশন, ভালো কিছু কল্পনা: def apply_set_operation(a, b, set_operation)। এই ফাংশনটি কল করার সময়, আমি পছন্দ apply_set_operation(a, b, set.union)করতে চাইapply_set_operation(a, b, set.__or__)
1

উত্তর:


309

আপনি সেটগুলির জন্য ইউনিয়ন পদ্ধতি ব্যবহার করতে পারেন: set.union(other_set)

নোট করুন যে এটি একটি নতুন সেট ফেরায় অর্থাৎ এটি নিজেই পরিবর্তন করে না।


54
যাইহোক, |পরিবর্তনশীল ইনলাইন পরিবর্তন করতে পারেন:set_a |= set_b
jorgenkg

12
হিসাবে একই @jorgenkg: set_a = set_a.union(set_b)। আপনি যদি "ইন-প্লেস" বলতে চান তবে দু'টিই এটি করবে না, set
দু'টি

3
@ জোজরেনগিগ এখনও এটি একটি নতুন সেট তৈরি করে এবং রেফারেন্সটি প্রতিস্থাপন করে।
আলভারো

3
@ অ্যালভারো @ একটি সাধারণ পরীক্ষা অনুসারে:, @ a = set((1, 2, 3,)); b = set((1, 3, 4,)); id_a = id(a); a |= b; assert id_a == id(a)জোরজেনকিগ সঠিক - ভেরিয়েবল aইনলাইন পরিবর্তন করা হয়েছে। আমি কিছু অনুপস্থিত করছি?
jhndodo

3
না, এটা মনে হচ্ছে না: a = set((1, 2, 3,)); b = set((1, 3, 4,)); c = a; a |= b; assert id(c) == id(a)aধ্বংস হয়ে গেলেও cহত না। এছাড়াও, cএখন set([1, 2, 3, 4]), তাই @ জর্জেঙ্কগের মন্তব্য সঠিক is
জোহানোদো

45

আপনি or_নাম ব্যবহার করতে পারেন :

>>> from operator import or_
>>> from functools import reduce # python3 required
>>> reduce(or_, [{1, 2, 3, 4}, {3, 4, 5, 6}])
set([1, 2, 3, 4, 5, 6])

9
এই পদ্ধতিটি পছন্দ করুন, আরও কার্যকরী এবং 2 বা ততোধিক সেটগুলিতে প্রয়োগ করা যেতে পারে।
কলিন সু

42

আপনি যদি মূল সেটটি সংশোধন করে ভাল থাকেন (যা আপনি কিছু ক্ষেত্রে করতে পারেন) তবে আপনি ব্যবহার করতে পারেন set.update():

S.update(T)

ফেরত মান হয় None, কিন্তু Sমূল ইউনিয়ন হতে আপডেট করা হবে Sএবং T


23

ধরে নিই যে আপনিও ব্যবহার করতে পারবেন না s.union(t), যা সমান s | t, আপনি চেষ্টা করতে পারেন

>>> from itertools import chain
>>> set(chain(s,t))
set([1, 2, 3, 4, 5, 6])

অথবা, যদি আপনি কোনও উপলব্ধি চান,

>>> {i for j in (s,t) for i in j}
set([1, 2, 3, 4, 5, 6])

14

যোগ দিয়ে যদি আপনি বোঝাচ্ছেন ইউনিয়ন, এটি চেষ্টা করুন:

set(list(s) + list(t))

এটি কিছুটা হ্যাক, তবে এটি করার জন্য আমি আরও ভাল লাইনারের কথা ভাবতে পারি না।


সেট (তালিকা (গুলি) + তালিকা (টি)) আপনি একই ইউনিয়ন করলে আপনি একই ফলাফল দেবেন।
আনসুমান বেবার্তা

আমি সচেতন, তবে দেখে মনে হচ্ছে তিনি পাইথন ফাংশনে অন্তর্নির্মিত ব্যবহারটি এড়াতে চাইছিলেন, অন্যথায় তিনি স্রেফ | অপারেটর.
বেনজামিন

listএবং setপাইথন ফাংশনে নির্মিত
whackamadoodle3000

10

মনে করুন আপনার 2 টি তালিকা রয়েছে

 A = [1,2,3,4]
 B = [3,4,5,6]

যাতে আপনি Aনিম্নলিখিত Bহিসাবে ইউনিয়ন খুঁজে পেতে পারেন

 union = set(A).union(set(B))

এছাড়াও যদি আপনি চৌরাস্তা এবং অ-ছেদ না খুঁজে পেতে চান তবে আপনি এটি অনুসরণ হিসাবে করুন

 intersection = set(A).intersection(set(B))
 non_intersection = union - intersection

7

আপনি উভয় সেটকে এই জাতীয় একটিতে আনপ্যাক করতে পারেন:

>>> set_1 = {1, 2, 3, 4}
>>> set_2 = {3, 4, 5, 6}
>>> union = {*set_1, *set_2}
>>> union
{1, 2, 3, 4, 5, 6}

*সেট unpacks। আনপ্যাকিং হ'ল যেখানে পুনরুক্তযোগ্য (যেমন একটি সেট বা তালিকা) প্রতিটি আইটেমের ফলন হিসাবে উপস্থাপিত হয়। এর অর্থ ওপরের উদাহরণটি সরল করে {1, 2, 3, 4, 3, 4, 5, 6}যা তখন সরল করে {1, 2, 3, 4, 5, 6}কারণ সেটটিতে কেবল অনন্য আইটেম থাকতে পারে।


*3 লাইনে কি করে ?
altabq

5

আপনি করতে পারেন unionবা সহজ তালিকা বোধগম্য

[A.add(_) for _ in B]

ক এর বি এর সমস্ত উপাদান থাকবে


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