সেট করতে তালিকা যুক্ত করবেন?


242

পাইথন ২.6 দোভাষীর পরীক্ষিত:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> a.add(l)
Traceback (most recent call last):
  File "<pyshell#35>", line 1, in <module>
    a.add(l)
TypeError: list objects are unhashable

আমি মনে করি যে আমি সেটটিতে তালিকাটি যুক্ত করতে পারছি না কারণ পাইথন কোনও উপায়ই বলতে পারে না যে আমি একই তালিকাতে দু'বার যুক্ত করেছি কিনা tell এখানে কি কাজ আছে?

সম্পাদনা: আমি তালিকাটি নিজেই যুক্ত করতে চাই, এর উপাদানগুলি নয়।


2
আপনি কি তালিকায় সেট বা আইটেমগুলিতে সেটটি যুক্ত করতে চান?
pkit

তালিকাটি নিজেই - আমি তালিকার একটি সেট রাখতে চাই।
আদম মতান

মনে হয় সেরা-উপযুক্ত উত্তরটি হ'ল আন্ডাররেটেডটি, কিছু তালিকা / কাতারে / ইত্যাদিতে নিজেকে lst যুক্ত করার আগে aSet.add (id (lst)) ব্যবহার করার পরামর্শ দিয়েছিল, নিশ্চিত হয়ে নিন যে আপনি এটি করেছেন। আপনি গৃহীত উত্তর পুনর্বিবেচনা করা উচিত।
রুস্তম এ।

উত্তর:


187

আপনি কোনও সেটে একটি তালিকা যুক্ত করতে পারবেন না কারণ তালিকাগুলি পরিবর্তনযোগ্য, এর অর্থ আপনি তালিকার বিষয়বস্তুগুলিকে সেটে যুক্ত করার পরে পরিবর্তন করতে পারবেন।

তবে আপনি সেটটিতে টিপলস যুক্ত করতে পারেন, কারণ আপনি একটি টিপলের সামগ্রী পরিবর্তন করতে পারবেন না:

>>> a.add(('f', 'g'))
>>> print a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

সম্পাদনা করুন : কিছু ব্যাখ্যা: ডকুমেন্টেশন এটিকে স্বতন্ত্র হ্যাশেবল অবজেক্টের একটি আনর্ডারড সংগ্রহset হিসাবে সংজ্ঞায়িত করে। অবজেক্টগুলি হ্যাশযোগ্য হতে হবে যাতে আপনি প্রতিটি সময় এই ক্রিয়াকলাপগুলি সম্পাদন করার সময় প্রতিটি পৃথক উপাদানকে দেখার চেয়ে উপাদানগুলি সন্ধান, যুক্ত করা এবং অপসারণ দ্রুত করা যায়। ব্যবহৃত নির্দিষ্ট অ্যালগরিদমগুলি উইকিপিডিয়া নিবন্ধে ব্যাখ্যা করা হয়েছে । পাইথন হ্যাশিং অ্যালগরিদমগুলি effbot.org এবং পাইথন রেফারেন্সে পাইথন __hash__ফাংশনে ব্যাখ্যা করা হয় ।

কিছু ঘটনা:

  • সেট উপাদানগুলির পাশাপাশি অভিধান কীগুলি হ্যাশেবল হতে হবে
  • কিছু অপ্রয়োজনীয় ডেটাটাইপস:
    • listtupleপরিবর্তে ব্যবহার করুন
    • setfrozensetপরিবর্তে ব্যবহার করুন
    • dict: কোনও অফিসিয়াল কাউন্টার পার্ট নেই, তবে কয়েকটি রেসিপি রয়েছে
  • প্রতিটি উদাহরণের একটি স্বতন্ত্র হ্যাশ থাকার সাথে অবজেক্টের দৃষ্টান্তগুলি ডিফল্টরূপে হ্যাশযোগ্য। পাইথন রেফারেন্সে বর্ণিত হিসাবে আপনি এই আচরণটি ওভাররাইড করতে পারেন।

6
এবং আপনি যদি কোনও সেটে কোনও সেট যুক্ত করতে চান তবে হিমায়িত ব্যবহার করুন।
ফোগলবার্ড

4
collections.namedtupleএর "অফিসিয়াল" প্রতিপক্ষ হিসাবে বিবেচিত হতে পারে dict
সাইলেন্টগোস্ট

1
@ ওয়াহনফ্রিডেন: এটি সেটের সামগ্রীগুলি যোগ করছে , সেটটি নিজেই নয়।
অটো অলমিনেঞ্জার

@ এহেল্কে: না, এটি প্রথম সেটে সেটগুলির উপাদান যুক্ত করে, তবে আমরা প্রথম সেটটির উপাদান হিসাবে একটি সেট যুক্ত করার বিষয়ে কথা বলছি।
জেফ লারম্যান

578

ব্যবহার করুন set.update()বা|=

>>> a = set('abc')
>>> l = ['d', 'e']
>>> a.update(l)
>>> a
{'e', 'b', 'c', 'd', 'a'}

>>> l = ['f', 'g']
>>> a |= set(l)
>>> a
{'e', 'b', 'f', 'c', 'd', 'g', 'a'}

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


set.update () সেটে তালিকার তালিকা যুক্ত করেছে, তাই না? পাইপ সমান অপারেটর কি জন্য?
ফিস্টঅফফুরি

সেটগুলির প্রতি সম্মান সহ, |অপারেটর সেট ইউনিয়ন অপারেশন প্রয়োগ করে । |=অপারেটর এবং set.update()পদ্ধতি উভয়ই সেই অপারেশনটিকে স্থানে প্রয়োগ করে এবং কার্যকরভাবে সমার্থক। সুতরাং, set_a |= set_bউভয়ের জন্য সিনট্যাকটিক চিনি হিসাবে বিবেচিত হতে পারে set_a.update(set_b) এবং set_a = set_a | set_b (পরবর্তী ক্ষেত্রে একই set_aজিনিসটি পুনরায় সাইন করা না করে পুনরায় ব্যবহার করা হয়)। </ahem>
সিসিল কারি

76

করার একটি সেট করার জন্য একটি তালিকা উপাদান যোগ , ব্যবহারupdate

Https://docs.python.org/2/library/sets.html থেকে

s.update (t): রিটার্ন সেট গুলি টি থেকে যুক্ত উপাদানগুলির সাথে

যেমন

>>> s = set([1, 2])
>>> l = [3, 4]
>>> s.update(l)
>>> s
{1, 2, 3, 4}

আপনি যদি পরিবর্তে পুরো তালিকাটিকে একটি একক উপাদান হিসাবে সেটটিতে যোগ করতে চান তবে আপনি পারবেন না কারণ তালিকাগুলি হ্যাশযোগ্য নয়। আপনি পরিবর্তে একটি tuple যোগ করতে পারে, যেমন s.add(tuple(l))। এ সম্পর্কে আরও তথ্যের জন্য বিল্ট-ইন সেট ফাংশনটি ব্যবহার করার সময় টাইপ-এয়ারার: ​​অরসাব্য টাইপ: 'তালিকা' দেখুন।


40

আশা করি এটি সাহায্য করে:

>>> seta = set('1234')
>>> listb = ['a','b','c']
>>> seta.union(listb)
set(['a', 'c', 'b', '1', '3', '2', '4'])
>>> seta
set(['1', '3', '2', '4'])
>>> seta = seta.union(listb)
>>> seta
set(['a', 'c', 'b', '1', '3', '2', '4'])

15

দয়া করে ফাংশনটি লক্ষ্য করুন set.update()। নথি বলছে:

নিজের এবং অন্যদের মিলনের সাথে একটি সেট আপডেট করুন।


5
এটি প্রশ্নের উত্তর দেয় না (যেহেতু ওপি সেটটিতে তালিকাটি নিজেই যুক্ত করতে চায়) তবে গুগল আমাকে এখানে আনার সময় আমার এই উত্তরটির দরকার ছিল :-)
টম স্ট্রেটন ২

1
ভাল, এটি আমার কাছে প্রশ্নের সর্বাধিক প্রাসঙ্গিক উত্তর বলে মনে হচ্ছে ... উদাহরণস্বরূপ, যদি বি = সেট ([1]), b.update ([7,25]) বি নিম্নলিখিত মান দেয়: সেট ([ 1, 25, 7]) ---> আমরা এখানে যা খুঁজছি তা কি এটি নয়?
লুই LC

8

তালিকা অবজেক্টগুলি অপ্রয়োজনীয় । আপনি যদিও তাদের টিউপলগুলিতে পরিণত করতে চান।


5

সেটগুলিতে পরিবর্তনীয় (পরিবর্তনযোগ্য) উপাদান / সদস্য থাকতে পারে না। একটি তালিকা, পরিবর্তনীয় হওয়ার কারণে, সেটে কোনও সদস্য হতে পারে না।

সেটগুলি যেমন পরিবর্তনীয় হয় তেমনি আপনার সেটগুলির সেটও থাকতে পারে না! আপনি হিমশীতল একটি সেট থাকতে পারে।

(একই ধরণের "পরিবর্তনের প্রয়োজনীয়তা" কোনও ডিকের কীগুলিতে প্রযোজ্য))

অন্যান্য উত্তর ইতিমধ্যে আপনাকে কোড দিয়েছে, আমি আশা করি এটি কিছুটা অন্তর্দৃষ্টি দেয়। আমি আশা করছি অ্যালেক্স মার্তেলি আরও বিশদ সহ উত্তর দেবেন।


4

আপনি একটি তালিকা যোগ করতে চান, একটি তালিকা:

>>> a=set('abcde')
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> l=['f','g']
>>> l
['f', 'g']
>>> t = tuple(l)
>>> t
('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

আপনার যদি একটি তালিকা থাকে তবে আপনি উপরে বর্ণিত হিসাবে টিপলে রূপান্তর করতে পারেন। একটি টিপল অপরিবর্তনীয়, তাই এটি সেট যোগ করা যেতে পারে।


4

আমি আজ আমার অনুরূপ কিছু করা প্রয়োজন পাওয়া গেছে। অ্যালগরিদম জানত যে এটি কখন একটি নতুন তালিকা তৈরি করছে যা সেটে যুক্ত করার দরকার ছিল, তবে কখন এটি তালিকাটিতে কাজ করা শেষ করবে না।

যাইহোক, আমি যে আচরণটি চেয়েছিলাম তা idবরং ব্যবহারের জন্য সেট করা ছিল hash। যেমন আমি দেখেছি mydict[id(mylist)] = mylistপরিবর্তে myset.add(mylist)আচরণ আমি চেয়েছিলেন উত্সর্গ করতে হয়।


3

আপনি টিউপলগুলি ব্যবহার করতে চাইবেন, যা হ্যাশযোগ্য (আপনি তালিকার মতো কোনও পরিবর্তনীয় জিনিস হ্যাশ করতে পারবেন না)।

>>> a = set("abcde")
>>> a
set(['a', 'c', 'b', 'e', 'd'])
>>> t = ('f', 'g')
>>> a.add(t)
>>> a
set(['a', 'c', 'b', 'e', 'd', ('f', 'g')])

2

এখানে আমি সাধারণত এটি করি:

def add_list_to_set(my_list, my_set):
    [my_set.add(each) for each in my_list]
return my_set

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