আমি কীভাবে কোনও সেটটিতে পুনরাবৃত্ত হওয়ার বিষয়বস্তু যুক্ত করব?


উত্তর:


228

আপনি একটি উপাদান যোগ করতে পারেন listএকটি থেকে setভালো:

>>> foo = set(range(0, 4))
>>> foo
set([0, 1, 2, 3])
>>> foo.update(range(2, 6))
>>> foo
set([0, 1, 2, 3, 4, 5])

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

7
সেই প্রতিনিধিত্ব আপনাকে একে একে ইন্টারেক্টিভ সেশনে ঠিক পেস্ট করতে দেয় কারণ setনির্মাতা তার আর্গুমেন্ট হিসাবে পুনরাবৃত্ত হয়।
ফ্রাঙ্ক কুষ্টার্স

3
লক্ষ্য করুন উপস্থাপনা মাত্র যেমন হয় {1, 2, 3}পাইথন 3 যেহেতু এটি ছিল set([1, 2, 3])পাইথন 2.
রাডন Rosborough

40

যে কেউ বিশ্বাস করতে পারে তার উপকারের জন্য যেমন aset.add()একটি লুপে কাজ করার সাথে প্রতিযোগিতামূলক দক্ষতা অর্জন করতে পারে aset.update(), এখানে জনসাধারণের আগে আপনি কীভাবে আপনার বিশ্বাসকে দ্রুত পরীক্ষা করতে পারেন তার একটি উদাহরণ এখানে:

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 294 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 950 usec per loop

>\python27\python -mtimeit -s"it=xrange(10000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 458 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a.update(it)"
1000 loops, best of 3: 598 usec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "for i in it:a.add(i)"
1000 loops, best of 3: 1.89 msec per loop

>\python27\python -mtimeit -s"it=xrange(20000);a=set(xrange(100))" "a |= set(it)"
1000 loops, best of 3: 891 usec per loop

দেখে মনে হচ্ছে লুপ পদ্ধতির প্রতি আইটেমের ব্যয়টি পদ্ধতির চেয়ে তিনগুণ বেশি update

ব্যবহার |= set()1.5x কী খরচ updateকরে কিন্তু কি প্রতিটি আইটেমের যুক্ত করতে একটি লুপ না অর্ধেক।


14

পুনরাবৃত্তিকে একটি সেটে রূপান্তর করতে আপনি সেট () ফাংশনটি ব্যবহার করতে পারেন এবং তারপরে আপনার নতুন সেট থেকে অনন্য মানগুলিকে বিদ্যমান একটিতে যুক্ত করতে স্ট্যান্ডার্ড সেট আপডেট অপারেটর (| =) ব্যবহার করতে পারেন।

>>> a = { 1, 2, 3 }
>>> b = ( 3, 4, 5 )
>>> a |= set(b)
>>> a
set([1, 2, 3, 4, 5])

5
ব্যবহার .updateসুবিধা যে যুক্তি কোনো iterable -not অগত্যা এর RHS অসদৃশ একটি set- করা যাবে |=আপনার উদাহরণে অপারেটর।
tzot

1
ভাল যুক্তি. এটি কেবল একটি নান্দনিক পছন্দ হ'ল সেট () একটি পুনরাবৃত্তিকে একটি সেটে রূপান্তর করতে পারে, তবে কীস্ট্রোকের সংখ্যা একই the
gbc

আমি এই অপারেটরটি আগে কখনও দেখিনি, ভবিষ্যতে যখন এটি পপ আপ হয় তখন আমি এটি ব্যবহার করে উপভোগ করব; ধন্যবাদ!
eipxen

1
@ আইপেক্সেন: সংঘবদ্ধকরণের |জন্য, &ছেদ করার জন্য, এবং ^উপাদানগুলি এক বা অন্যটিতে রয়েছে তবে উভয়ের নয় both তবে গতিশীল টাইপিত ভাষায় যেখানে কোডটি পড়তে এবং চারপাশে উড়তে থাকা অবজেক্টের ধরণগুলি জানার জন্য মাঝে মাঝে অসুবিধা হয়, আমি এই অপারেটরগুলি ব্যবহার করতে দ্বিধা বোধ করি। যে কেউ তাদের চিনতে পারে না (বা সম্ভবত এটি বুঝতেও পারে না যে পাইথন এগুলির মতো অপারেটরদের অনুমতি দেয়) বিভ্রান্ত হতে পারে এবং মনে করে কিছু অদ্ভুত বিটওয়াস বা যৌক্তিক ক্রিয়াকলাপ চলছে। এই অপারেটররা অন্যান্য পুনরাবৃত্তদের উপরও যদি কাজ করত তবে ভালো লাগবে ...
আর্টঅফ ওয়ারফেয়ার

এই বিপরীতে কিছু সময় পরীক্ষা চালান .update()এবং একটি লুপে পৃথক উপাদান যুক্ত করুন। .update()দ্রুত ছিল যে পাওয়া গেছে । : আমি এই বিদ্যমান উত্তর আমার ফলাফল যোগ stackoverflow.com/a/4046249/901641
ArtOfWarfare

4

অজগর 3 ব্যবহারের সময় মাত্র একটি দ্রুত আপডেট:

#!/usr/local/bin python3
from timeit import Timer

a = set(range(1, 100000))
b = list(range(50000, 150000))

def one_by_one(s, l):
    for i in l:
        s.add(i)    

def cast_to_list_and_back(s, l):
    s = set(list(s) + l)

def update_set(s,l):
    s.update(l)

ফলাফলগুলি হ'ল:

one_by_one 10.184448844986036
cast_to_list_and_back 7.969255169969983
update_set 2.212590195937082

0

তালিকা বোধগম্যতা ব্যবহার করুন।

উদাহরণস্বরূপ একটি তালিকা ব্যবহার করে পুনরাবৃত্তিযোগ্য তৈরির সংক্ষিপ্তসার :)

>>> x = [1, 2, 3, 4]
>>> 
>>> k = x.__iter__()
>>> k
<listiterator object at 0x100517490>
>>> l = [y for y in k]
>>> l
[1, 2, 3, 4]
>>> 
>>> z = Set([1,2])
>>> z.update(l)
>>> z
set([1, 2, 3, 4])
>>> 

[সম্পাদনা: প্রশ্নের সেট অংশটি মিস করেছেন]


1
আমি কোন সেট দেখছি না? আমি কিছু অনুপস্থিত করছি?
ইয়ান ম্যাকিননন

-2
for item in items:
   extant_set.add(item)

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

আমি যুক্তি দিয়ে বলব যে আমার প্রস্তাবিত সমাধানটি পরিষ্কারভাবে পাঠযোগ্য, এবং আপনি যা চান তা করেন does এর সাথে জড়িত কোনও পারফরম্যান্স হিট রয়েছে বলে আমি বিশ্বাস করি না - যদিও আমি স্বীকার করি যে আমি কিছু মিস করছি। তবে এত কিছুর পরেও এটি অন্য বিকাশকারীদের কাছে সম্ভবত সুস্পষ্ট এবং পছন্দনীয় নয়।


আহা! লুপটি এক লাইনে থাকার জন্য আমার উত্তরে ফর্ম্যাট করছে - আমি কখনই এটি করব না। কখনো।
জায়েদেল

আপনি একেবারে সঠিক। আমার ক্ষতি মেরামত করার জন্য আমি পোস্টটি সম্পাদনা করেছি। ধন্যবাদ :)
জায়েডেল

9
আপনি যে বিন্দুটি aset.update(iterable)সি গতিতে for item in iterable: aset.add(item)লুপ করছেন সেখানে পাইথন গতিতে লুপ রয়েছে, একটি পদ্ধতি অনুসন্ধান এবং আইটেম প্রতি পদ্ধতি কল (আড়ালঘা !!)।
জন মাচিন

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