প্রতিটি সাবলিস্টের প্রথম আইটেমটি বের করুন


146

আমি ভাবছি যে তালিকার তালিকায় প্রতিটি সাবলিস্টের প্রথম আইটেমটি বের করে এনে একটি নতুন তালিকায় যুক্ত করার সর্বোত্তম উপায় কী? সুতরাং আমি যদি:

lst = [[a,b,c], [1,2,3], [x,y,z]]

এবং আমি বৈঠাচালনা আউট করতে চান a, 1এবং xসেই থেকে একটি পৃথক তালিকা তৈরি করুন।

আমি চেষ্টা করেছিলাম:

lst2.append(x[0] for x in lst)

1
আপনার কোড প্রায় সঠিক। একমাত্র ইস্যু তালিকা বোধগম্যতার ব্যবহার।
অভিষেক মিত্তাল

উত্তর:


198

তালিকা বোঝার ব্যবহার :

>>> lst = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [item[0] for item in lst]
>>> lst2
['a', 1, 'x']

তালিকা অনুধাবন পদ্ধতিটিও দ্রুততম, নম্পি পদ্ধতির চেয়েও দ্রুত। jboi এর উত্তর পারফরম্যান্স তুলনা সম্পর্কে আলোচনা,
কিয়াও ঝাং

83

আপনি জিপ ব্যবহার করতে পারেন:

>>> lst=[[1,2,3],[11,12,13],[21,22,23]]
>>> zip(*lst)[0]
(1, 11, 21)

অথবা, পাইথন 3 যেখানে zipএকটি তালিকা তৈরি করে না:

>>> list(zip(*lst))[0]
(1, 11, 21)

অথবা,

>>> next(zip(*lst))
(1, 11, 21)

বা, (আমার পছন্দসই) নম্পটি ব্যবহার করুন:

>>> import numpy as np
>>> a=np.array([[1,2,3],[11,12,13],[21,22,23]])
>>> a
array([[ 1,  2,  3],
       [11, 12, 13],
       [21, 22, 23]])
>>> a[:,0]
array([ 1, 11, 21])

ডাউনটাভোট করেন নি তবে প্রথম কোড স্নিপেট (জিপ) উত্পাদন করে: "'জিপ' অবজেক্ট সাবস্ক্রিপ্টযোগ্য নয়"। জুপিটারে পাইথন ৩.6
jboi

@ জবোই: কেবল listপ্রথমে এটি ঘিরে রাখুন বা ব্যবহার করুন next। ধন্যবাদ
7:38

20

একই সমস্যা ছিল এবং প্রতিটি সমাধানের কার্য সম্পাদন সম্পর্কে কৌতূহল পেয়েছে।

এখানে %timeit:

import numpy as np
lst = [['a','b','c'], [1,2,3], ['x','y','z']]

অ্যারে রূপান্তরকারী প্রথম ন্যালি-ওয়ে:

%timeit list(np.array(lst).T[0])
4.9 µs ± 163 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

তালিকা বোধগম্যতা ব্যবহার করে সম্পূর্ণ নেটিভ (যেমন @ আলেক্সেক্স ব্যাখ্যা করেছেন):

%timeit [item[0] for item in lst]
379 ns ± 23.1 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

আর একটি নেটিভ উপায় ব্যবহার করে zip(@ ডগ দ্বারা ব্যাখ্যা করা হয়েছে):

%timeit list(zip(*lst))[0]
585 ns ± 7.26 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

দ্বিতীয় স্তন্যপায়ী। @ ডগ দ্বারাও ব্যাখ্যা করা হয়েছে:

%timeit list(np.array(lst)[:,0])
4.95 µs ± 179 ns per loop (mean ± std. dev. of 7 runs, 100000 loops each)

আশ্চর্যজনকভাবে (ভাল, কমপক্ষে আমার জন্য) তালিকা বোধগম্যতার নেটিভ উপায় হ'ল নম্পি-ওয়েয়ের চেয়ে দ্রুত এবং প্রায় 10x দ্রুত। চূড়ান্ত ছাড়াই দুটি ন্যালি-উপায় চালানো listপ্রায় এক ভাগ সাশ্রয় করে যা এখনও 10x পার্থক্যের মধ্যে রয়েছে।

মনে রাখবেন, lenজেনারেটরগুলি শেষ অবধি চালিত হয় তা নিশ্চিত করার জন্য আমি যখন প্রতিটি কোড স্নিপেটকে কল দিয়ে ঘিরেছিলাম , সময় একই ছিল।


4
অ্যারে তৈরি করার সময় যথেষ্ট ওভারহেড থাকে।
hpulj

1
এইচপিউলজের সাথে সম্মত হন, আপনি যদি নাম্পার অ্যারে দিয়ে শুরু করেন, [:, 0] দ্রুত। এটিকে যান: lst = np.array ([['a', 'বি', 'সি'], [1,2,3], ['x', 'y', 'জেড']]), তারপরে lst [:, 0]। উদাহরণস্বরূপ ট্রায়ালগুলিতে রূপান্তর তালিকা বোধগম্যকে একটি অনুচিত সুবিধা দেয়। আপনি যদি করতে পারেন তবে গতি যদি আপনার চূড়ান্ত লক্ষ্য হয় তবে আপনার ডেটা সংরক্ষণ করার জন্য একটি অদ্ভুত অ্যারে ব্যবহার করুন। নম্পি প্রায় সবসময় দ্রুত হয়। এটি গতির জন্য নির্মিত
স্পেসডাস্টপি

13

পাইথন আইটেমজেটার নামে একটি ফাংশন অন্তর্ভুক্ত করে তালিকার নির্দিষ্ট সূচীতে আইটেমটি ফিরিয়ে দেয়:

from operator import itemgetter

আপনি যে আইটেমটি পুনরুদ্ধার করতে চান তার সূচি ফাংশন করুন আইটেমটেটার ()। প্রথম আইটেমটি পুনরুদ্ধার করতে, আপনি আইটেমজেটার (0) ব্যবহার করবেন। বুঝতে গুরুত্বপূর্ণ বিষয় হ'ল আইটেমজিটার নিজেই একটি ফাংশন ফিরিয়ে দেয়। যদি আপনি সেই ফাংশনে কোনও তালিকা পাস করেন তবে আপনি নির্দিষ্ট আইটেমটি পাবেন:

itemgetter(0)([10, 20, 30]) # Returns 10

আপনি যখন এটি মানচিত্র () এর সাথে একত্রিত করেন তখন এটি কার্যকর হয় যা এটি প্রথম যুক্তি হিসাবে একটি ফাংশন গ্রহণ করে এবং দ্বিতীয় যুক্তি হিসাবে একটি তালিকা (বা অন্য কোনও পুনরাবৃত্ত)। এটি পুনরাবৃত্তিযোগ্য প্রতিটি বস্তুর উপর ফাংশন কল করার ফলাফল প্রদান করে:

my_list = [['a', 'b', 'c'], [1, 2, 3], ['x', 'y', 'z']]
list(map(itemgetter(0), my_list)) # Returns ['a', 1, 'x']

মনে রাখবেন যে মানচিত্রটি () একটি জেনারেটর দেয়, তাই ফলাফলটি তালিকার () কাছে পাস করে আসল তালিকা পেতে। সংক্ষেপে, আপনার কাজটি এইভাবে করা যেতে পারে:

lst2.append(list(map(itemgetter(0), lst)))

এটি তালিকা বোধগম্যতা ব্যবহারের বিকল্প বিকল্প এবং কোন পদ্ধতিটি সর্বোচ্চ চয়ন করতে হবে তা প্রসঙ্গ, পাঠযোগ্যতা এবং পছন্দের উপর নির্ভর করে।

আরও তথ্য: https://docs.python.org/3/library/operator.html#operator.itemgetter


2

আপনার কোড প্রায় সঠিক। একমাত্র ইস্যু তালিকা বোধগম্যতার ব্যবহার।

আপনি যদি এই জাতীয় ব্যবহার করেন: (x [0] x এর জন্য x) আপনি যদি এর মতো ব্যবহার করেন: [x [0] x এর জন্য lst], এটি একটি তালিকা ফেরত দেয়।

আপনি যখন তালিকায় তালিকাটি বোঝার আউটপুট যুক্ত করবেন তখন তালিকা বোঝার আউটপুট হল তালিকার একক উপাদান।

lst = [["a","b","c"], [1,2,3], ["x","y","z"]]
lst2 = []
lst2.append([x[0] for x in lst])
print lst2[0]

lst2 = [['a', 1, 'x']]

lst2 [0] = ['এ', 1, 'এক্স']

আমি ভুল হলে আমাকে জানাবেন।


1
lst = [['a','b','c'], [1,2,3], ['x','y','z']]
outputlist = []
for values in lst:
    outputlist.append(values[0])

print(outputlist) 

আউটপুট: ['a', 1, 'x']


0

আপনি বলেছিলেন যে আপনার একটি বিদ্যমান তালিকা রয়েছে। তাই আমি সঙ্গে যেতে হবে।

>>> lst1 = [['a','b','c'], [1,2,3], ['x','y','z']]
>>> lst2 = [1, 2, 3]

এখনই আপনি জেনারেটর অবজেক্টটিকে আপনার দ্বিতীয় তালিকায় যুক্ত করছেন।

>>> lst2.append(item[0] for item in lst)
>>> lst2
[1, 2, 3, <generator object <genexpr> at 0xb74b3554>]

তবে আপনি সম্ভবত এটি প্রথম আইটেমের একটি তালিকা হতে চান

>>> lst2.append([item[0] for item in lst])
>>> lst2
[1, 2, 3, ['a', 1, 'x']]

এখন আমরা বিদ্যমান তালিকায় প্রথম আইটেমের তালিকা যুক্ত করেছি। আপনি যদি বিদ্যমান আইটেমগুলিতে আইটেমগুলি নিজেই যুক্ত করতে চান তবে সেগুলির একটি তালিকা নয়, আপনি তালিকাটি ব্যবহার করুন ex সেক্ষেত্রে আমাদের কোনও জেনারেটর যুক্ত করার বিষয়ে চিন্তা করার দরকার নেই, কারণ প্রসারিত বর্তমান জেনারেটরটি সেখান থেকে প্রাপ্ত প্রতিটি আইটেম যুক্ত করার জন্য, বর্তমান তালিকাটি প্রসারিত করার জন্য ব্যবহার করবে।

>>> lst2.extend(item[0] for item in lst)
>>> lst2
[1, 2, 3, 'a', 1, 'x']

অথবা

>>> lst2 + [x[0] for x in lst]
[1, 2, 3, 'a', 1, 'x']
>>> lst2
[1, 2, 3]

https://docs.python.org/3.4/tutorial/datastructures.html#more-on-lists https://docs.python.org/3.4/tutorial/datastructures.html#list- কমফেরেন্স


1
আপনার উত্তর চমৎকার এবং এটা কি জন্য সম্পূর্ণ হলে শোনাচ্ছে ওপি চায় মত, কিন্তু আমি শব্দ মনে appendপ্রশ্নে বিভ্রান্তি সৃষ্টি করছে। এটি শুনে মনে হচ্ছে সে কেবল আপনার সমাধানের তালিকা বোঝার অংশটি চায়।
beroe
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.