2009-05-12 15 views
5

मैं सूचियों की सूची में किसी विशिष्ट आइटम का स्थान (ओं) ढूंढना चाहता हूं। इसे टुपल्स की एक सूची वापस करनी चाहिए, जहां प्रत्येक टुपल आइटम के विशिष्ट उदाहरण के लिए इंडेक्स का प्रतिनिधित्व करता है। उदाहरण के लिए:सूचियों की पाइथन सूची में किसी आइटम के स्थान कैसे प्राप्त कर सकते हैं?

list = [['1', '2', '4', '6'], ['7', '0', '1', '4']] 
getPosition('1') #returns [(0, 0), (1, 2)] 
and getPosition('7') #returns [(1,0)] 
+0

क्या निम्न सूची के लिए वापस आ जाना चाहिए: [[ '1', '1', '1', '1'], [ '7', '0', '4'] ]? – SilentGhost

+0

@ सिलेंटगोस्ट - मैं कहूंगा: [(0,0), (0,1), (0,2), (0,3)] –

+3

मैं चर नाम "सूची" का उपयोग करने से बचूंगा, क्योंकि यह है एक अंतर्निहित प्रकार – Noah

उत्तर

2
def get_positions(xs, target): 
    return [(i,e.index(target)) for i,e in enumerate(xs)] 

एक अच्छा प्रारंभिक बिंदु है यही कारण है कि। मुमकिन है आप जो इस मामले में आप कहते हैं कि यदि आपका लक्ष्य हर स्थिति में नहीं है

model = SomeClass() 
model.get_position(1) # returns [(0,0), (1,2)] 

ध्यान दें कि दोनों ही मामलों में आप एक अपवाद मिल जाएगा जाने के रूप में

class SomeClass: 
    def __init__(self): 
     self.xs = [['1','2','4','6'], ['7','0','1','4']] 

    def get_positions(self, target): 
     return [(i,e.index(target)) for i,e in enumerate(self.xs)] 

ऐसे वर्ग के कुछ प्रकार है आपके उपन्यासकारों में से एक। सवाल यह निर्दिष्ट नहीं करता है कि यह वांछित व्यवहार है या नहीं।

+0

मुझे विश्वास नहीं है कि यह सवाल फिट बैठता है। 'GetPosition' के लिए तर्क एक तत्व (या उप-तत्व) है जबकि लौटाया मूल्य एक स्थिति है, विपरीत नहीं। –

+0

हाँ, मैंने इसे पहले गलत तरीके से पढ़ा है, लेकिन मैंने सही कोड करने के लिए अपना कोड तय कर लिया है। –

5

ऐसा लगता है कि आप चाहते हैं कि उपन्यासियों और एक दिए गए आइटम की सूची के लिए, जोड़ी की एक सूची लौटाएं जहां प्रत्येक जोड़ी है (उपमहाद्वीप की अनुक्रमणिका, उपन्यास के भीतर वस्तु का सूचकांक)। आप ऐसा कर सकते हैं list comprehensions का उपयोग करने और पायथन के enumerate() समारोह में बनाया गया:

def getPosition(list, item): 
    return [(i, sublist.index(item)) for i, sublist in enumerate(list)] 

संपादित करें:/नीचे ऊपर देखें @ आड़ी-तिरछी रेखाएं का जवाब।

+0

और ResEdit आइकन के लिए +1 :) – Noah

+0

यह आइटम तोड़ देगा यदि आइटम प्रत्येक उपन्यास में नहीं है। नीचे मेरा सुझाव देखें। या ऊपर, अंत में, मुझे आशा है कि :-) - 53 सेकंड पहले – Arkady

+0

हाँ, मैं @ स्क्रबल के कारण के लिए -1 पर जा रहा हूं - अगर कोई उपशीर्षक किसी आइटम को याद कर रहा है तो यह अपवाद फेंक देगा। –

2

यदि आइटम सूची में नहीं है तो आप अपवाद नहीं चाहते हैं। जनरेटर के रूप में भी वे शांत और बहुमुखी हैं।

xs = [['1', '2', '4', '6'], ['7', '0', '1', '4']] 
def get_positions(xs, item): 
    for i, xt in enumerate(xs): 
     try: # trying beats checking 
      yield (i, xt.index(item)) 
     except ValueError: 
      pass 

print list(get_positions(xs, '1')) 
print list(get_positions(xs, '6')) 

# Edit for fun: The one-line version, without try: 

get_positions2 = lambda xs,item: ((i,xt.index(item)) for i, xt in enumerate(xs) if item in xt) 

print list(get_positions2(xs, '1')) 
print list(get_positions2(xs, '6')) 
7

आप कुछ है कि दोनों

  • डुप्लिकेट मिलेगा और
  • संभाल नेस्टेड सूची (... की सूची की सूची की सूची)

आप कुछ कर सकते हैं चाहते हैं निम्न की तरह:

def get_positions(xs, item): 
    if isinstance(xs, list): 
     for i, it in enumerate(xs): 
      for pos in get_positions(it, item): 
       yield (i,) + pos 
    elif xs == item: 
     yield() 

परीक्षण इस:

>>> xs = [['1', '2', '4', '6'], 
...  ['7', '0', '1', '4'], 
...  [ [ '0', '1', '1'], ['1']] 
...  ] 
>>> print list(get_positions(xs, '1')) 
[(0, 0), (1, 2), (2, 0, 1), (2, 0, 2), (2, 1, 0)] 
0

कुछ समय पहले मैं अजगर के लिए एक पुस्तकालय लिखा सूची मिलान कि बिल बहुत अच्छी तरह से फिट करने के लिए। यह टोकन का इस्तेमाल किया? +, और * वाइल्डकार्ड के रूप में, कहाँ? एक परमाणु को दर्शाता है, + एक लालची एक या अधिक है, और * लालची एक या अधिक है। उदाहरण के लिए: यहाँ

from matching import match 

match(['?', 2, 3, '*'], [1, 2, 3, 4, 5]) 
=> [1, [4, 5]] 

match([1, 2, 3], [1, 2, 4]) 
=> MatchError: broken at 4 

match([1, [2, 3, '*']], [1, [2, 3, 4]]) 
=> [[4]] 

match([1, [2, 3, '*']], [1, [2, 3, 4]], True) 
=> [1, 2, 3, [4]] 

डाउनलोड यह: http://www.artfulcode.net/wp-content/uploads/2008/12/matching.zip

0

यहाँ की कोशिश के बिना एक संस्करण है ..को छोड़कर, पुनरावर्तक और उस

[['1', '1', '1', '1'], ['7', '0', '4']] 

रिटर्न

[(0, 0), (0, 1), (0, 2), (0, 3)] 


def getPosition1(l, val): 
    for row_nb, r in enumerate(l): 
     for col_nb in (x for x in xrange(len(r)) if r[x] == val): 
     yield row_nb, col_nb 
+0

ध्यान दें कि निम्नलिखित भी एक छोटा सा तेजी से लगता है: डीईएफ़ getPosition1 (एल, वैल): row_nb के लिए , की गणना में आर (एल): col_nb के लिए , _ की गणना में (आर यदि आइटम में आइटम के लिए आइटम == वैल्यू): उपज row_nb, col_nb – odwl

0

सबसे strainghtforward और शायद सबसे धीमी तरीके से करना के लिए लौटने से यह होगा:

>>> value = '1' 
    >>> l = [['1', '2', '3', '4'], ['3', '4', '5', '1']] 
    >>> m = [] 
    >>> for i in range(len(l)): 
    ... for j in range(len(l[i])): 
    ... if l[i][j] == value: 
    ... m.append((i,j)) 
    ... 
    >>> m 
    [(0, 0), (1, 3)] 
0

यहाँ एक और सीधे आगे तरीका है जो जनरेटर का उपयोग नहीं करता है।

def getPosition(lists,item): 
    positions = [] 
    for i,li in enumerate(lists): 
     j = -1 
     try: 
      while True: 
       j = li.index(item,j+1) 
       positions.append((i,j)) 
     except ValueError: 
      pass 
    return positions 

l = [['1', '2', '4', '6'], ['7', '0', '1', '4']] 
getPosition(l,'1') #returns [(0, 0), (1, 2)] 
getPosition(l,'9') # returns [] 

l = [['1', '1', '1', '1'], ['7', '0', '1', '4']] 
getPosition(l,'1') #returns [(0, 0), (0, 1), (0,2), (0,3), (1,2)] 
3
def getPosition(list, item): 
    return [(i, sublist.index(item)) for i, sublist in enumerate(list) 
                 if item in sublist] 
+1

ऐसा लगता है कि स्क्रिबल या स्क्रिप्बल ने नाम बदल दिए हैं? अन्यथा @apaidnerd संदर्भ कौन सा है? – emmagras

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