প্রথম উপাদানটিতে একটি তালিকা এবং একটি একক আদেশে "লেজ" আনপ্যাক করার কোনও অজগর উপায় আছে?
উদাহরণ স্বরূপ:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
প্রথম উপাদানটিতে একটি তালিকা এবং একটি একক আদেশে "লেজ" আনপ্যাক করার কোনও অজগর উপায় আছে?
উদাহরণ স্বরূপ:
>> head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
উত্তর:
পাইথন ৩.x এর অধীনে, আপনি এটিকে সুন্দরভাবে করতে পারেন:
>>> head, *tail = [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
3.x এ একটি নতুন বৈশিষ্ট্য হ'ল *
অপারেটিংটি আনপ্যাকিংয়ে ব্যবহার করা , কোনও অতিরিক্ত মান বোঝানো। এটি পিইপি 3132- এ বর্ণনা করা হয়েছে - এক্সটেন্ডেড আইটেবল আনপ্যাকিং । এটি কেবল সিকোয়েন্সগুলি নয়, কোনও পুনরাবৃত্তির উপর কাজ করার সুবিধাও রয়েছে।
এটি সত্যই পঠনযোগ্য।
পিইপিতে বর্ণিত হিসাবে, আপনি যদি ২.x এর অধীনে (সম্ভাব্য কোনও অস্থায়ী তালিকা তৈরি না করে) সমতুল্য করতে চান তবে আপনাকে এটি করতে হবে:
it = iter(iterable)
head, tail = next(it), list(it)
মন্তব্যে উল্লিখিত হিসাবে, এটি head
একটি ব্যতিক্রম ছোঁড়ার পরিবর্তে ডিফল্ট মান পাওয়ার একটি সুযোগও সরবরাহ করে । আপনি যদি এই আচরণটি চান, next()
একটি ডিফল্ট মান সহ একটি alচ্ছিক দ্বিতীয় যুক্তি গ্রহণ করে, তাই যদি কোনও প্রধান উপাদান না থাকে তবে next(it, None)
আপনাকে দেবে None
।
স্বাভাবিকভাবেই, আপনি যদি একটি তালিকায় কাজ করছেন তবে 3.x বাক্য বিন্যাস ছাড়াই সবচেয়ে সহজ উপায় হ'ল:
head, tail = seq[0], seq[1:]
__getitem__
/ প্রয়োগ করতে পারে __setitem__
, তবে অন্তর্নির্মিত তালিকাটি তা করে না।
python 3.x
ও (1) head,tail
অপারেশন জটিলতার জন্য আপনার deque
তবে ব্যবহার করা উচিত ।
নিম্নলিখিত উপায়:
from collections import deque
l = deque([1,2,3,4,5,6,7,8,9])
head, tail = l.popleft(), l
তালিকার সমস্ত উপাদানগুলির মাধ্যমে পুনরাবৃত্তি করতে হবে এটি দরকারী It's উদাহরণস্বরূপ নিষ্প্রভ মার্জ 2 পার্টিশন মার্জ সাজানোর মধ্যে।
head, tail = l.popleft(), l
হ'ল ~ O (1)। head, tail = seq[0], seq[1:]
ও (এন) হয়।
head = l.popleft()
এবং tail
ঠিক উপনাম হল l
। যদি l
পরিবর্তনগুলিও tail
পরিবর্তন হয়।
পাইথন 2, ল্যাম্বডা ব্যবহার করে
>>> head, tail = (lambda lst: (lst[0], lst[1:]))([1, 1, 2, 3, 5, 8, 13, 21, 34, 55])
>>> head
1
>>> tail
[1, 2, 3, 5, 8, 13, 21, 34, 55]
head, tail = lst[0], lst[1:]
? যদি ওপি এর অর্থ আক্ষরিক ব্যবহার হয় তবে সে নিজেই মাথা এবং লেজ ভাগ করে দিতে পারেhead, tail = 1, [1, 2, 3, 5, 8, 13, 21, 34, 55]
lst = ...
পূর্ববর্তী লাইনে তাই না )। (২) না করার ফলে head, tail = lst[0], lst[1:]
কোডটি পার্শ্ব-প্রতিক্রিয়াতে খোলে (বিবেচনা করুন head, tail = get_list()[0], get_list()[1:]
), এবং অপের রূপের চেয়ে আলাদা head, tail = **some_magic applied to** [1, 1, 2, 3, 5, 8, 13, 21, 34, 55]
।
@ গ্যারেথল্যাটি থেকে পাইথন 2 সমাধানের উপর ভিত্তি করে, পাইথন 2 তে অন্তর্বর্তী ভেরিয়েবলগুলি ছাড়াই একটি একক লাইন সমতুল্য হওয়ার উপায় নীচে।
t=iter([1, 1, 2, 3, 5, 8, 13, 21, 34, 55]);h,t = [(h,list(t)) for h in t][0]
যদি আপনার এটির ব্যতিক্রম-প্রমাণ (যেমন খালি তালিকার পক্ষে সমর্থন করা) দরকার হয় তবে যুক্ত করুন:
t=iter([]);h,t = ([(h,list(t)) for h in t]+[(None,[])])[0]
আপনি যদি সেমিকোলন ছাড়াই এটি করতে চান তবে ব্যবহার করুন:
h,t = ([(h,list(t)) for t in [iter([1,2,3,4])] for h in t]+[(None,[])])[0]