টিপলগুলির তালিকা থেকে কীভাবে এন-তম উপাদানগুলি নিষ্কাশন করা যায়?


112

আমি টিপলগুলির একটি তালিকা থেকে এন-তম উপাদানগুলি পাওয়ার চেষ্টা করছি।

আমার মতো কিছু আছে:

elements = [(1,1,1),(2,3,7),(3,5,10)]

আমি প্রতিটি টুপলের কেবলমাত্র দ্বিতীয় উপাদানগুলি একটি তালিকায় বের করতে চাই:

seconds = [1, 3, 5]

আমি জানি যে এটি একটি forলুপ দিয়ে সম্পন্ন করা যেতে পারে তবে আমি জানতে চেয়েছিলাম যে আমার আরও কয়েক হাজার টিপল রয়েছে বলে অন্য কোনও উপায় আছে কিনা।

উত্তর:



34

এটিও কাজ করে:

zip(*elements)[1]

(আমি মূলত এটি পোস্ট করছি, নিজেকে প্রমাণ করার জন্য যে আমি খাঁটি করেছি zip...)

এটি কর্মে দেখুন:

>>> help(zip)

মডিউলে builtin ফাংশন জিপ এ সহায়তার builtin :

zip (...)

জিপ (seq1 [, seq2 [...]]) -> [(seq1 [0], seq2 [0] ...), (...)]

টিপলগুলির একটি তালিকা ফেরত দিন, যেখানে প্রতিটি টিপলে আর্গুমেন্টের অনুক্রমের প্রতিটি থেকে আই-থ উপাদান রয়েছে। প্রত্যাবর্তিত তালিকাটি সংক্ষিপ্ত আর্গুমেন্ট ক্রমের দৈর্ঘ্যে কাটা হয়েছে।

>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> zip(*elements)
[(1, 2, 3), (1, 3, 5), (1, 7, 10)]
>>> zip(*elements)[1]
(1, 3, 5)
>>>

আমি আজ শিখেছি পরিষ্কার জিনিস: *listএকটি ফাংশনের জন্য প্যারামিটার তালিকা তৈরি করতে যুক্তিগুলিতে ব্যবহার করুন ...

দ্রষ্টব্য : পাইথন 3 এ, zipএকটি পুনরাবৃত্তির ফেরত দেয়, তার পরিবর্তে টিপলগুলির list(zip(*elements))একটি তালিকা ফেরত দিতে ব্যবহার করুন ।


2
এবং **dictকীওয়ার্ড আর্গুমেন্ট তৈরি করতে ব্যবহার করুন : def test(foo=3, bar=3): return foo*barতারপরেd = {'bar': 9, 'foo'=12}; print test(**d)
ওয়েইন ওয়ার্নার

@ ওয়াইন ওয়ার্নার: হ্যাঁ এই স্টাফটি ছিল কেবলমাত্র প্যাসিভ জ্ঞান (আমি প্রায়শই এটি ব্যবহার করি না) - তবে এখনই মনে করিয়ে দেওয়া ভাল এবং তাই আপনি কোথায় / কী সন্ধান করবেন তা আপনি জানেন ...
ড্যারেন টমাস

1
সত্য গল্প - আমি দেখি যে কিছু আমি প্রায়ই যথেষ্ট ব্যবহার করুন (পাইথন, তেজ), আমি ঝরঝরে / শীতল প্রয়োজন অনুস্মারক ঝোঁক অতিরিক্ত বৈশিষ্ট্যগুলিও উপস্থিত রয়েছে যে আমি ভুলে গিয়ে থাকেন, কারণ আমি তাদের ব্যবহার করবেন না যে প্রায়ই।
ওয়েন ওয়ার্নার

* তালিকা সিনট্যাক্স বেশ দরকারী। অফিসিয়াল পাইথন ডকুমেন্টেশনে এটি বর্ণিত কোন ধারণা?
ব্যবহারকারী1748155

আমি এটি টিউটোরিয়ালে কেবলমাত্র পেয়েছি: ডকস.পিথন.আর.
ড্যারেন টমাস

30

আমি জানি যে এটি একটি ফর দিয়ে সম্পন্ন করা যেতে পারে তবে আমি অন্য কোনও উপায় আছে কিনা তা জানতে চেয়েছিলাম

আরও একটি উপায় আছে। আপনি এটি মানচিত্র এবং আইটেমজেটার দিয়েও করতে পারেন :

>>> from operator import itemgetter
>>> map(itemgetter(1), elements)

এটি এখনও অভ্যন্তরীণভাবে একটি লুপ সম্পাদন করে এবং এটি তালিকা বোধের তুলনায় কিছুটা ধীরে ধীরে:

setup = 'elements = [(1,1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))

ফলাফল:

পদ্ধতি 1: 1.25699996948
পদ্ধতি 2: 1.46600008011

যদি আপনাকে কোনও তালিকার উপরে পুনরাবৃত্তি করতে হয় তবে একটি ব্যবহার forকরা ভাল।


2
একটি ছোট সংযোজন: পাইথন -৩.x এ বেঞ্চমার্কটি দেখায় যে মানচিত্রটি কেবলমাত্র এক মিলি সেকেন্ডের একটি ভগ্নাংশ নেয়। কারণ এটি একটি পুনরাবৃত্তি ফিরিয়ে দেবে। পদ্ধতি 2 = 'তালিকা (মানচিত্র (আইটেমজেটার (1), উপাদান))' পুরানো আচরণকে রেন্ডার করে।
মাইক বেকম্যান

12

2-টিউপল তালিকার দ্বিতীয় উপাদানটি টানতে কোন উপায়ে সবচেয়ে দ্রুততর তা অনুসন্ধান করার সময় এটি খুঁজে পেয়েছি। আমি যা চাইছিলাম তা নয় তবে তৃতীয় পদ্ধতির সাথে জিপ পদ্ধতির পরীক্ষা হিসাবে দেখানো একই পরীক্ষা চালিয়েছে

setup = 'elements = [(1,1) for _ in range(100000)];from operator import itemgetter'
method1 = '[x[1] for x in elements]'
method2 = 'map(itemgetter(1), elements)'
method3 = 'dict(elements).values()'
method4 = 'zip(*elements)[1]'

import timeit
t = timeit.Timer(method1, setup)
print('Method 1: ' + str(t.timeit(100)))
t = timeit.Timer(method2, setup)
print('Method 2: ' + str(t.timeit(100)))
t = timeit.Timer(method3, setup)
print('Method 3: ' + str(t.timeit(100)))
t = timeit.Timer(method4, setup)
print('Method 4: ' + str(t.timeit(100)))

Method 1: 0.618785858154
Method 2: 0.711684942245
Method 3: 0.298138141632
Method 4: 1.32586884499

দ্বিগুণ তত দ্রুত হলে আপনার যদি একটি ডুপ রূপান্তর করতে এবং মানগুলি গ্রহণের জন্য 2 টি টিপল জুড়ি থাকে।


এটি সম্ভবত সুস্পষ্ট তবে আমি উল্লেখ dict(elements).values()করব যে তালিকার সংক্ষিপ্তসার বা মানচিত্রের বিপরীতে ওয়ান-এলিমেন্ট ডিকের ফলাফল হবে। এটি হ'ল আমি যা চেয়েছিলাম (আমি অনন্য টিপলগুলিতে আগ্রহী) (+1 এবং পোস্ট করার জন্য বড় ধন্যবাদ) তবে অন্যরাও ডিক্স দ্রুততর কেন তা ভাবতে পারে - এটি মেমরি বরাদ্দ করে না তবে কেবল বিদ্যমান উপাদানগুলির বিরুদ্ধে পরীক্ষা করে।
গ্রেগেরি

6

2-টিউপল তালিকা থেকে দ্বিতীয় উপাদানটি বের করার জন্য পাইথন 3.6 এর সময়সীমা।

এছাড়াও, যোগ করা numpyঅ্যারে পদ্ধতি, যা পড়ার জন্য সহজ (তবে তালিকার বোঝার তুলনায় তর্কযোগ্যভাবে সহজ)।

from operator import itemgetter
elements = [(1,1) for _ in range(100000)]

%timeit second = [x[1] for x in elements]
%timeit second = list(map(itemgetter(1), elements))
%timeit second = dict(elements).values()
%timeit second = list(zip(*elements))[1]
%timeit second = np.array(elements)[:,1]

এবং সময়:

list comprehension:  4.73 ms ± 206 µs per loop
list(map):           5.3 ms ± 167 µs per loop
dict:                2.25 ms ± 103 µs per loop
list(zip)            5.2 ms ± 252 µs per loop
numpy array:        28.7 ms ± 1.88 ms per loop

নোট করুন map()এবং zip()কোনও তালিকা আর ফিরিয়ে দেবেন না, সুতরাং সুস্পষ্ট রূপান্তর।



1

ব্যবহার isliceএবং chain.from_iterable:

>>> from itertools import chain, islice
>>> elements = [(1,1,1),(2,3,7),(3,5,10)]
>>> list(chain.from_iterable(islice(item, 1, 2) for item in elements))
[1, 3, 5]

আপনার একাধিক উপাদানের প্রয়োজন হলে এটি কার্যকর হতে পারে:

>>> elements = [(0, 1, 2, 3, 4, 5), 
                (10, 11, 12, 13, 14, 15), 
                (20, 21, 22, 23, 24, 25)]
>>> list(chain.from_iterable(islice(tuple_, 2, 5) for tuple_ in elements))
[2, 3, 4, 12, 13, 14, 22, 23, 24]
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.