পাইথনে বিজ্ঞপ্তি তালিকা পুনরায়


106

আমার একবারে একটি বিজ্ঞপ্তি তালিকার পুনরাবৃত্তি করা দরকার, সম্ভবত বার বার সর্বশেষ পরিদর্শন করা আইটেমটি দিয়ে শুরু করা।

ব্যবহারের কেসটি একটি সংযোগ পুল। একটি ক্লায়েন্ট সংযোগের জন্য জিজ্ঞাসা করে, একটি পুনরুক্তিকারী পয়েন্ট-টু সংযোগ উপলব্ধ কিনা তা পরীক্ষা করে তা ফেরত দেয়, অন্যথায় এটি উপলব্ধ না হওয়া অবধি লুপ হয়।

পাইথনে এটি করার কি কোনও পরিষ্কার উপায় নেই?

উত্তর:


169

ব্যবহার করুন itertools.cycle, এটি এর সঠিক উদ্দেশ্য:

from itertools import cycle

lst = ['a', 'b', 'c']

pool = cycle(lst)

for item in pool:
    print item,

আউটপুট:

a b c a b c ...

(লুপস চিরকাল, স্পষ্টতই)


পুনরুক্তিটিকে ম্যানুয়ালি অগ্রসর করার জন্য এবং একে থেকে মানগুলি একে একে টেনে আনতে, কেবল কল করুন next(pool):

>>> next(pool)
'a'
>>> next(pool)
'b'

4
আপনি একটি লুপে আইটেমগুলি মুদ্রণ করছেন। আমি কী লুপটি ছেড়ে আবার ফিরে আসতে চাই? (আমি যেখানেই চলেছি সেখানেই শুরু করতে চাই)।
ব্যবহারকারী 443854

7
@ ব্যবহারকারী 443854 pool.next()চক্রটি থেকে একক পরবর্তী আইটেমটি পেতে ব্যবহার করুন
জ্যাকব ক্রল

4
@ user443854 এফডাব্লুআইডাব্লু এটি আমার চেয়ে অনেক ভাল উত্তর। লাইব্রেরি ফাংশন পুনরায় বাস্তবায়নের কোন কারণ নেই!
জ্যাকব ক্রোল

5
পুল.নেক্সট () আমার পক্ষে কাজ করে না, কেবল পরের (পুল)। সম্ভবত পাইথন 3 এর কারণে?
fjsj

6
@fjsj যা সঠিক, পাইথন 3 এ আপনাকে ব্যবহার করা দরকার next(iterator)(যা বিটিডাব্লু পাইথন ২.x এও ঠিক কাজ করে, এবং তাই এটি ব্যবহার করা উচিত নীতিগত রূপ)। জেনারেটর.নেক্সট () অজগর 3.0 এ দৃশ্যমান দেখুন ? আরও গভীরতর ব্যাখ্যার জন্য। সেই অনুসারে আমার উত্তর আপডেট করুন।
লুকাশ গ্রাফ

56

সঠিক উত্তরটি হ'ল itertools.cycle ব্যবহার করা । তবে, ধরে নেওয়া যাক লাইব্রেরির ফাংশনটি বিদ্যমান নেই। আপনি কীভাবে এটি বাস্তবায়ন করবেন?

একটি জেনারেটর ব্যবহার করুন :

def circular():
    while True:
        for connection in ['a', 'b', 'c']:
            yield connection

তারপরে, আপনি হয় forঅসীম পুনরাবৃত্তি করতে একটি বিবৃতি ব্যবহার করতে পারেন , বা আপনি next()জেনারেটরের পুনরুক্তিকারীর কাছ থেকে একক পরবর্তী মান পেতে কল করতে পারেন :

connections = circular()
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
next(connections) # 'b'
next(connections) # 'c'
next(connections) # 'a'
#....

চমৎকার! তালিকাটি শেষ হয়ে গেলে কীভাবে এটি শুরু হবে?
ব্যবহারকারী 443854

4
@ ব্যবহারকারী 443854 while Trueচিরতরে পুনরাবৃত্তি করার উপায়গুলি
জ্যাকব ਕੁਲ

4
@ জুয়ানচোপাঞ্জা: হ্যাঁ; itertools.cycleএটি একটি ভাল উত্তর। এটি প্রদর্শিত itertoolsনা হলে আপনি কীভাবে একই কার্যকারিতা লিখতে পারেন তা দেখায় :)
জ্যাকব ক্রোল

সাধারণ জেনারেটরও কি প্রতিটি উপাদানটির অনুলিপি সংরক্ষণ itertools.cycleকরে? না কি সাধারণ জেনারেটরটি আরও মেমরি-দক্ষ ডিজাইন হতে পারে? প্রতি cycleডক্স :Note, this member of the toolkit may require significant auxiliary storage (depending on the length of the iterable).
dthor

4
@ অধিক এই জেনারেটরটি তিনটি উপাদান সহ একটি তালিকা তৈরি করে এবং এর উপরে সাক্ষরতা দেয়, তারপরে তালিকাটি নষ্ট করে দেয় এবং চিরস্থায়ীভাবে একটি নতুন তৈরি করে। এই নথির জন্য ডকুমেন্টেশনটি cycleবোঝায় যে ইনপুট পুনরাবৃত্ত listহওয়ার সাথে সাথে তার জেনারেটরটি শুরু হওয়ার আগে রূপান্তরিত হয় , যেহেতু iterableশুধুমাত্র "মানগুলির সেটের উপরে একটি পাসের জন্য ভাল"।
জ্যাকব ক্রল

9

বা আপনি এটি করতে পারেন:

conn = ['a', 'b', 'c', 'd', 'e', 'f']
conn_len = len(conn)
index = 0
while True:
    print(conn[index])
    index = (index + 1) % conn_len

ছদ্মবেশে আবদাদেফ সি ... চিরকাল


4

আপনি append(pop())লুপ দিয়ে এটি সম্পাদন করতে পারেন :

l = ['a','b','c','d']
while True:
    print l[0]
    l.append(l.pop(0))

বা for i in range()লুপ:

l = ['a','b','c','d']
ll = len(l)
while True:
    for i in range(ll):
       print l[i]

বা সহজভাবে:

l = ['a','b','c','d']

while True:
    for i in l:
       print i

যা সব মুদ্রণ:

>>>
a
b
c
d
a
b
c
d
...etc.

তিনটির মধ্যে আমি একটি ফাংশন হিসাবে অ্যাপেন্ড (পপ ()) পদ্ধতির প্রবণ হয়ে থাকি

servers = ['a','b','c','d']

def rotate_servers(servers):
    servers.append(servers.pop(0))
    return servers

while True:
    servers = rotate_servers(servers)
    print servers[0]

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

3

আপনি যদি nসময় চক্র করতে চান , তবে ncycles এরল্টুলগুলি রেসিপিটি প্রয়োগ করুন :

from itertools import chain, repeat


def ncycles(iterable, n):
    "Returns the sequence elements n times"
    return chain.from_iterable(repeat(tuple(iterable), n))


list(ncycles(["a", "b", "c"], 3))
# ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c']

2

আপনার একটি কাস্টম পুনরাবৃত্তি দরকার - আমি এই উত্তরটি থেকে পুনরুক্তিকারীকে অভিযোজ করব ।

from itertools import cycle

class ConnectionPool():
    def __init__(self, ...):
        # whatever is appropriate here to initilize
        # your data
        self.pool = cycle([blah, blah, etc])
    def __iter__(self):
        return self
    def __next__(self):
        for connection in self.pool:
            if connection.is_available:  # or however you spell it
                return connection

0

অসীম লুপ এড়াতে, তালিকার আকার দ্বিগুণ না হওয়া পর্যন্ত আমি পুনরাবৃত্ত করতে অ্যারের দৈর্ঘ্য ব্যবহার করেছি You আপনি নিজের প্রাক শর্তটি বাস্তবায়ন করতে পারবেন dআমি অসীম লুপ এড়ানো।

#Implement Circular Linked List
from itertools import cycle
list=[1,2,3,4,5]
lstlength=len(list)*2
print(lstlength)
pool=cycle(list)
i=0
#To avoid infinite loop break when you have iterated twice size of the list
for items in pool:
    print(items)
    if i >lstlength:
        break
    i += 1
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.