पायथन में, मैं एक सूची को दूसरी सूची के साथ कैसे अनुक्रमित करूं?


130

मैं एक सूची को इस तरह से दूसरी सूची के साथ अनुक्रमित करना चाहूंगा

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

और T को एक सूची होनी चाहिए जिसमें ['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]

7
क्या यह फॉर-लूप या केवल छोटे से तेज है?
डैनियल आंद्रे

10
@ डैनियल: दोनों ने सिफारिश की
साइलेंटगॉस्ट

14
एक त्वरित समय परीक्षण (कोई pysco या कुछ भी नहीं है, इसलिए इसे आप क्या करेंगे) लूप की तुलना में सूची को 2.5x तेज दिखाया गया है (1000 तत्व, 10000 बार दोहराया गया)।
जेम्स हॉपकिन

2
(मानचित्र और एक लंबो का उपयोग करना और भी धीमा है - उम्मीद की जानी चाहिए, क्योंकि यह प्रत्येक पुनरावृत्ति के लिए एक फ़ंक्शन कहता है)
जेम्स हॉपकिन

+1 यदि अनुक्रमण सूची मनमानी है, तो एक सूची कॉमरेडेन्शन तरीका है। मुझे लगता है कि हालांकि, जब संभव हो, जो यहां मामला नहीं लगता है, तो स्लाइस और भी तेज हैं।
Jaime

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']
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.