2015-02-27 11 views
6

मान लीजिए मैं दो सूचियों (या numpy.array रों) है:कैसे अजगर में दो सूचियों की तुलना करने के

a = [1,2,3] 
b = [4,5,6] 

मैं कैसे जांच कर सकते हैं a के प्रत्येक तत्व एक ही सूचकांक में b के तत्व इसी से छोटा होता है? (मैं यह सोचते हैं हूँ सूचकांक 0 से शुरू कर रहे हैं) अर्थात

at index 0 value of a = 1 < value of b = 4 
at index 1 value of a = 2 < value of b = 5 
at index 2 value of a = 3 < value of b = 6 

तो a[1,2,7] के बराबर थे, तो यह गलत होगा क्योंकि a के सूचकांक 2 मूल्य पर b की तुलना में अधिक है। इसके अलावा a की लंबाई b की तुलना में कम थी, तो यह b के साथ केवल a के सूचकांक की तुलना करनी चाहिए।

उदाहरण इस जोड़ी a के लिए, b

a = [1,2] 
b = [3,4,5] 

सूचकांक 0 और 1 पर, a का मूल्य इस प्रकार यह भी जाँच में सफल होगा b से छोटी है।

पीएस .--> मुझे if कथन के अंदर उपरोक्त स्थितियों का उपयोग करना होगा। और, a का कोई भी तत्व b के बराबर होना चाहिए यानी सख्ती से कम। जितनी चाहें उतनी औजारों का उपयोग करने के लिए स्वतंत्र महसूस करें। (हालांकि मैं सूचियों यहाँ का उपयोग कर रहा है, तो आप उपरोक्त सूची NumPy सरणी में भी बदल सकते हैं।)

उत्तर

4

एक प्रकार के रूप में, तेजी से और कम

from operator import lt 
from itertools import starmap, izip 
all(starmap(lt, izip(a, b))) 
+0

@ एन्टी हापाला, ए और बी के लिए, जहां एक = सूची (रेंज (10000)) और बी = सूची (रेंज (1, 10001)) मेरे सिस्टम पर आपका समाधान 80 9 माइक्रोसॉन्ड देता है और मेरा 558 – Retard

+0

वास्तव में आपका है तेज़ एक है: डी कम tuple निर्माण की वजह से। –

+0

मैं आपकी परीक्षण प्रक्रिया के बारे में उत्सुक हूं। क्या आपके लिए परीक्षण प्रदान करना संभव है? (आप http://pythonfiddle.com/ का उपयोग कर सकते हैं) – Exelian

12

zip और all

all(i < j for (i, j) in zip(a, b)) 

zip साथ दोनों भागों का जवाब मूल्यों के साथ a की शुरुआत से मूल्यों युग्मित हो जाएगा b की शुरुआत से; जब पुनरावृत्त कम हो जाता है तो पुनरावृत्ति समाप्त होती है। allTrue देता है यदि केवल और यदि किसी दिए गए सभी आइटम बूलियन संदर्भ में सत्य हैं। साथ ही, जब कोई आइटम विफल रहता है, False जल्दी वापस आ जाएगा।

उदाहरण परिणाम: IPython 3.4.2 के साथ

>>> a = [1,2,3] 
>>> b = [4,5,6] 
>>> all(i < j for (i, j) in zip(a, b)) 
True 
>>> a = [1,2,7] 
>>> b = [4,5,6] 
>>> all(i < j for (i, j) in zip(a, b)) 
False 
>>> a = [1,2] 
>>> b = [4,5,-10] 
>>> all(i < j for (i, j) in zip(a, b)) 
True 

समय:

In [1]: a = [1] * 10000 
In [2]: b = [1] * 10000 
In [3]: %timeit all(i < j for (i, j) in zip(a, b)) 
1000 loops, best of 3: 995 µs per loop 
In [4]: %timeit all(starmap(lt, zip(a, b))) 
1000 loops, best of 3: 487 µs per loop 

तो Starmap तेजी से इस मामले में है। सामान्य रूप से 2 चीजें पाइथन में अपेक्षाकृत धीमी होती हैं: फ़ंक्शन कॉल और नाम लुकअप। starmapRetard's solution का यहां बिल्कुल जीतना प्रतीत होता है क्योंकि zip से प्राप्त ट्यूपल को lt बिल्टिन फ़ंक्शन के रूप में * के रूप में खिलाया जा सकता है, जबकि मेरे कोड को इसे डिज़ाइन करने की आवश्यकता है।

2

के बाद से इस सवाल का एक numpy टैग है, मैं समझ मैं एक numpy समाधान प्रदान करेगा।

आप केवल < ऑपरेटर का उपयोग arrays पर बराबर लंबाई के लिए कर सकते हैं, इसलिए यदि आपके arrays अलग-अलग लंबाई हैं तो आपको सबसे लंबे समय तक कम करने की आवश्यकता है।

In [26]: import numpy as np 

In [27]: a = [1,2,3] 

In [28]: b = [4,5,6] 

In [29]: np.all(a < b) 
Out[29]: True 

In [30]: a = [1,2] 

In [31]: b = [3,4,5] 

In [32]: shortest = min(len(a), len(b)) 

In [33]: np.all(a[:shortest] < b[:shortest]) 
Out[33]: True 
1

बस एक वैकल्पिक तरीका है, और यकीन नहीं है कि यह कैसे अन्य उत्तर के खिलाफ करता है:

a = [1,2,3] 
b = [4,5,6] 
if filter(lambda x: x[0] < x[1], zip(a,b)): 
    return True 

मैं अगर-कथन में यह उपयोग कर रहा हूँ के बाद से सवाल इंगित करता है, कि यह होने वाला है इस तरह इस्तेमाल किया जाता है, और वहां एक बूल-रूपांतरण की आवश्यकता नहीं है। अन्यथा मैं फ़िल्टर() को बूल() के अंदर लपेटता। फिर, यह केवल एक वैकल्पिक दृष्टिकोण का प्रदर्शन करने के लिए है, जिसका मतलब सबसे कुशल नहीं है।

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