পাইথনে, আমি কীভাবে অন্য তালিকার সাথে একটি তালিকা সূচী করব?


130

আমি এই জাতীয় অন্য তালিকার সাথে একটি তালিকা সূচী করতে চাই

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
T = L[ Idx ]

এবং টি'র তালিকাতে ['a', 'd', 'h'] থাকা উচিত।

এর চেয়ে ভাল উপায় আর কি আছে?

T = []
for i in Idx:
    T.append(L[i])

print T
# Gives result ['a', 'd', 'h']

উত্তর:


241
T = [L[i] for i in Idx]

6
এটি কি ফর-লুপের চেয়ে দ্রুত বা কেবল খাটো?
ড্যানিয়েল আন্দ্রান

9
@ ড্যানিয়েল: উভয় + প্রস্তাবিত
সাইলেন্টগোস্ট

13
একটি দ্রুত টাইমিং পরীক্ষা (কোনও পাইস্কো বা কিছুই নয়, তাই আপনি যা করবেন তা তৈরি করুন) লুপের তুলনায় তালিকাটি বোঝার 2.5x দ্রুত দেখিয়েছে (1000 উপাদানগুলি, 10000 বার পুনরাবৃত্তি করা হয়েছে)।
জেমস হপকিন

2
(মানচিত্র এবং একটি ল্যাম্বডা ব্যবহার আরও ধীর - প্রত্যাশিত, যেহেতু এটি প্রতিটি পুনরাবৃত্তির জন্য একটি ফাংশন বলে)
জেমস হপকিন

+1 যদি সূচকের তালিকাটি নির্বিচারে হয়, তবে একটি তালিকা সংমিশ্রনের উপায়। আমি মনে করি যদিও এটি সম্ভব হলে, যা এখানে ক্ষেত্রে বলে মনে হয় না, টুকরোগুলি আরও দ্রুত।
জয়মে

41

আপনি যদি ন্পু ব্যবহার করেন তবে আপনি এর মতো বর্ধিত কাটা কাটা করতে পারেন:

>>> import numpy
>>> a=numpy.array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
>>> Idx = [0, 3, 7]
>>> a[Idx]
array(['a', 'd', 'h'], 
      dtype='|S1')

... এবং সম্ভবত এটি আরও দ্রুত (যদি নাম্বার আমদানি নিয়ে বিরক্ত করার জন্য পারফরম্যান্স যথেষ্ট উদ্বেগের হয়)


5
আমার দ্রুত টাইমিট পরীক্ষায় দেখা গেছে যে np.array ব্যবহার করা আসলে প্রায় 3 গুণ ধীর হয় (অ্যারেতে রূপান্তর সহ)।
আন্দ্রেজ প্রোনোবিস

আপনার যদি যাইহোক অ্যারে অপারেশনের জন্য রূপান্তর করতে হবে তবে এটি আরও ভাল কাজ করে। নিয়মিত তালিকা ক্রিয়াকলাপের জন্য খুব বেশি সময়সাপেক্ষ।
ফ্র্যাঙ্কলিওও

9

একটি কার্যকরী পদ্ধতির:

a = [1,"A", 34, -123, "Hello", 12]
b = [0, 2, 5]

from operator import itemgetter

print(list(itemgetter(*b)(a)))
[1, 34, 12]

যদি bকেবল একটি আইটেম থাকে তবে এটি কাজ করবে না ।
blhsing


5

আমি এই পদ্ধতির কোনওটিতেই সন্তুষ্ট ছিলাম না, তাই আমি Flexlistএমন একটি শ্রেণী নিয়ে এসেছি যা পূর্ণাঙ্গ, স্লাইস বা সূচী-তালিকা দ্বারা নমনীয় সূচকের জন্য অনুমতি দেয়:

class Flexlist(list):
    def __getitem__(self, keys):
        if isinstance(keys, (int, slice)): return list.__getitem__(self, keys)
        return [self[k] for k in keys]

যা, উদাহরণস্বরূপ, আপনি এটি হিসাবে ব্যবহার করবেন:

L = Flexlist(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h'])
Idx = [0, 3, 7]
T = L[ Idx ]

print(T)  # ['a', 'd', 'h']

যা পাইথনের শক্তি এবং নমনীয়তাও প্রদর্শন করে!
কাকী

এটি বিদ্যমান কোডের পাশাপাশি এটি প্রসারিত করা এত সহজ। কেবল কল করুন existing_list = Flexlist(existing_list)এবং আমাদের কোনও কোড না ভেঙে প্রয়োজনীয় কার্যকারিতা রয়েছে
যিশ

1
L= {'a':'a','d':'d', 'h':'h'}
index= ['a','d','h'] 
for keys in index:
    print(L[keys])

আমি একটি Dict addকাঙ্ক্ষিত ব্যবহার keysকরতে হবেindex


0

আপনি নীচের মত __getitem__একত্রিত পদ্ধতি ব্যবহার করতে পারেন map:

L = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h']
Idx = [0, 3, 7]
res = list(map(L.__getitem__, Idx))
print(res)
# ['a', 'd', 'h']
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.