প্রায়শই যথেষ্ট, আমি জোড়া দ্বারা একটি তালিকা প্রক্রিয়া করার প্রয়োজনীয়তা খুঁজে পেয়েছি। আমি ভাবছিলাম যে এটি করার অজগর এবং দক্ষ উপায় কোনটি হবে এবং এটি গুগলে খুঁজে পেয়েছি:
pairs = zip(t[::2], t[1::2])
আমি ভেবেছিলাম যে এটি যথেষ্ট অজগর, তবে সাম্প্রতিক আলোচনার পরে আইডিয়ামগুলি দক্ষতার সাথে জড়িত , আমি কিছু পরীক্ষা করার সিদ্ধান্ত নিয়েছি:
import time
from itertools import islice, izip
def pairs_1(t):
return zip(t[::2], t[1::2])
def pairs_2(t):
return izip(t[::2], t[1::2])
def pairs_3(t):
return izip(islice(t,None,None,2), islice(t,1,None,2))
A = range(10000)
B = xrange(len(A))
def pairs_4(t):
# ignore value of t!
t = B
return izip(islice(t,None,None,2), islice(t,1,None,2))
for f in pairs_1, pairs_2, pairs_3, pairs_4:
# time the pairing
s = time.time()
for i in range(1000):
p = f(A)
t1 = time.time() - s
# time using the pairs
s = time.time()
for i in range(1000):
p = f(A)
for a, b in p:
pass
t2 = time.time() - s
print t1, t2, t2-t1
এগুলি আমার কম্পিউটারে ফলাফল ছিল:
1.48668909073 2.63187503815 1.14518594742
0.105381965637 1.35109519958 1.24571323395
0.00257992744446 1.46182489395 1.45924496651
0.00251388549805 1.70076990128 1.69825601578
যদি আমি তাদের সঠিকভাবে ব্যাখ্যা করছি তবে এর অর্থ এই যে পাইথনে তালিকাগুলি, তালিকা সূচীকরণ এবং তালিকা স্লাইসিং কার্যকর করা খুব কার্যকর। এটি আরামদায়ক এবং অপ্রত্যাশিত উভয়ই ফলাফল।
জোড়ের তালিকায় ট্র্যাভারিংয়ের আরও কি কোনও "ভাল" উপায় আছে?
মনে রাখবেন যে তালিকার একটি অদ্ভুত সংখ্যক উপাদান রয়েছে তবে শেষেরটি কোনও জোড়াতে থাকবে না।
সমস্ত উপাদান অন্তর্ভুক্ত রয়েছে তা নিশ্চিত করার সঠিক উপায় কোনটি?
আমি পরীক্ষাগুলির উত্তরগুলি থেকে এই দুটি পরামর্শ যুক্ত করেছি:
def pairwise(t):
it = iter(t)
return izip(it, it)
def chunkwise(t, size=2):
it = iter(t)
return izip(*[it]*size)
এগুলি ফলাফল:
0.00159502029419 1.25745987892 1.25586485863
0.00222492218018 1.23795199394 1.23572707176
এখনও পর্যন্ত ফলাফল
সর্বাধিক অজগর এবং খুব দক্ষ:
pairs = izip(t[::2], t[1::2])
সবচেয়ে দক্ষ এবং খুব পাইথোনিক:
pairs = izip(*[iter(t)]*2)
এই মুহুর্তে আমার এক মুহুর্ত লেগেছিল যে প্রথম উত্তরটি দুটি পুনরুক্তি ব্যবহার করে যখন দ্বিতীয়টি একক ব্যবহার করে।
বিজোড় সংখ্যক উপাদানের সাথে সিকোয়েন্সগুলি মোকাবেলা করার জন্য, পরামর্শটি হ'ল মূল সিকোয়েন্সটি একটি উপাদান ( None
) যুক্ত করে যুক্ত করা হবে যা পূর্ববর্তী শেষ উপাদানটির সাথে যুক্ত হয়ে যায়, এমন কিছু যা অর্জন করা যায় itertools.izip_longest()
।
অবশেষে
দ্রষ্টব্য, পাইথন 3.x এ, zip()
যেমন আচরণ করে itertools.izip()
এবং itertools.izip()
চলে গেছে।