2012-04-12 19 views
7

आइए कहें कि मेरे पास दो सूचियां हैं। वे -5 से 5 तक पैमाने पर पुस्तकों की रेटिंग की सूचियां हैं।आइटम की स्थिति के आधार पर दो सूचियों पर इंडेक्स खोजें

मैं जानना चाहता हूं कि list1 का तत्व >= 1 और list2 का तत्व == 0 है, उदाहरण के लिए।

list1 = [3, 3, 1, 0, 3, 0, 3, 0, 0, -3, 0, 5, 3, 0, 1, 0, 0, 5, 3, 0, 0, 0, 0, 1, 0, 3, 0, 1, 0, 0, 3, 5, 3, 3, 0, 0, 0, 5, 0, 5, 0, 3, 3, 0, -3, 0, 0, 5, 1, 5, 3, 0, 3, 0, 0] 
list2 = [5, 0, 0, 0, 0, 0, 5, 0, 0, 1, 0, 5, 3, 0, 0, 0, 0, 3, 0, 0, 0, 0, 0, 3, 0, 5, 0, 0, 0, 0, 5, 5, 5, 3, 0, 0, 0, 3, 0, 0, 0, 5, 3, 0, 0, 0, 0, 5, 0, 5, 3, 0, 0, 0, 0] 

list1[1] = 3 और list2[1] = 0, मैं जहां इस पर होता है के विभिन्न अनुक्रमित ढूँढने में सक्षम होना चाहता हूँ।

क्षमा करें अगर यह भ्रमित है लेकिन मुझे वास्तव में यह नहीं पता कि यह कैसे और शब्द है।

उत्तर

11
>>> [i for i, v in enumerate(list1) if v>=1 and list2[i]==0] 
[1, 2, 4, 14, 18, 27, 39, 48, 52] 
+0

पूरी तरह से काम किया, मदद के लिए बहुत बहुत धन्यवाद! – Mike

4
>>>idx_list = [i for i in range(len(list1)) if list1[i] > 1 and list2[i] == 0] 
+0

मुझे यह एक और पसंद है क्योंकि यह मध्यवर्ती चर नहीं बनाता है - फ़िल्टर में तुलना सीधे होती है ('list1' और 'list2' दोनों वहां हैं), और मानसिक रूप से ट्रैक करना आसान है। नहीं 'v' कि आपको यह देखने के लिए लाइन स्कैन करनी है कि यह कैसे परिभाषित किया गया है। – Izkata

2

मैं इस अधिक पठनीय पाया।

>>> from itertools import count 
>>> [i for i,one,two in zip(count(0), list1, list2) if one >= 1 and two == 0] 
[1, 2, 4, 14, 18, 27, 39, 48, 52] 

और यहां itertools.count doc है।

+1

+1 लेकिन 'गिनती (0)' की बजाय 'गिनती (0) 'क्यों है? इसके अलावा मुझे यह सबसे अच्छा समाधान माना जाता है। – jamylak

+0

@jamylak: पठनीयता। मैं भी, मैं इस कोड का उपयोग अपने कोड में करूँगा :) –

+0

असल में इस पर वापस देखकर मुझे लगता है कि मैं [i के लिए, i, (x, y) गणना में (iizip (list1, list2)) x > = 1 और वाई == 0] 'गिनती गिनती के बजाय। – jamylak

7

एक और प्रकार:

>>> [i for i, (l1, l2) in enumerate(zip(list1, list2)) if l1 >= 1 and l2 == 0] 
[1, 2, 4, 14, 18, 27, 39, 48, 52] 
+1

शायद यह है कि मैंने क्या किया होगा। मुझे यह तथ्य पसंद है कि यह समान रूप से दो सूची तत्वों का व्यवहार करता है ('v' बनाम 'list2 [i]' के विपरीत), लेकिन सूचकांक' i' और तत्व 'l1', 'l2' थोड़ा अलग तरीके से व्यवहार करता है, इसलिए वाक्यविन्यास अर्थशास्त्र फिट बैठता है। – DSM

2

NumPy सरणी का उपयोग करना, यह तार्किक अनुक्रमण के साथ क्या-सक्षम है:

import numpy as np 
list1 = np.array([1, -1, 0, 0, 1]) 
list2 = np.array([0, 5, 0, 0, 0]) 

# Option 1, multiply the logicals together. 
inds = np.where((list1 >= 1)*(list2 == 0))[0] 

# Option 2, pure logicals. 
inds = np.where((list1 >= 1) & (list2 == 0))[0] 

अब inds[0] = 0 और inds[1] = 4

+1

'और' '' 'से अधिक स्वाभाविक रूप से पढ़ा जाएगा, मुझे लगता है। – DSM

+0

शायद ऐसा है, लेकिन मैं हमेशा इसके बारे में बूलियन की एक सरणी पर वेक्टर अंकगणितीय के रूप में सोचना पसंद करता हूं। लेकिन यह सुनिश्चित करना अच्छा होता है कि लोग जानते हैं कि दोनों विकल्प मौजूद हैं। – ely

+0

इसके बारे में सोचने के लिए आओ, '== सही' अनावश्यक है, नहीं? – DSM

संबंधित मुद्दे