2009-01-29 16 views
25

को देखते हुए [1,2,3,4,5], मैं की तरहपायथन: के लिए प्रत्येक सूची तत्व सूची

1/1, 1/2, 1/3,1/4,1/5, ...., 3/1,3/2,3/3,3/4,3/5,.... 5/1,5/2,5/3,5/4,5/5 

कुछ मैं सभी परिणाम स्टोर करने के लिए चाहते हैं कैसे कर सकते हैं भर में एक समारोह के लागू होते हैं, कम से कम मिल जाए, और इस्तेमाल किया दो नंबर वापसी न्यूनतम खोजने के लिए। तो अगर मैंने ऊपर वर्णित किया है तो मैं (1,5) वापस करना चाहता हूं।

तो बुनियादी तौर पर मैं इस सूची सूची के सभी तत्वों भर में कुछ समारोह के नक्शे, i और j लेने एक मास्टर सूची में दुकान परिणाम पैरामीटर के रूप में में प्रत्येक तत्व i के लिए की तरह

कुछ करना चाहते हैं, मास्टर सूची में न्यूनतम मान पाएं, और तर्कों को वापस लौटें i, j इस न्यूनतम मान की गणना करने के लिए उपयोग किया जाता है।

मेरी वास्तविक समस्या में मेरे पास एक सूची वस्तुएं/निर्देशांक हैं, और जो फ़ंक्शन मैं उपयोग कर रहा हूं वह दो निर्देशांक लेता है और यूक्लिडियन दूरी की गणना करता है। मैं किसी भी दो बिंदुओं के बीच न्यूनतम यूक्लिडियन दूरी खोजने की कोशिश कर रहा हूं लेकिन मुझे एक फैंसी एल्गोरिदम की आवश्यकता नहीं है।

उत्तर

42

आप इस का उपयोग कर list comprehensions और min() (अजगर 3.0 कोड) कर सकते हैं:

>>> nums = [1,2,3,4,5] 
>>> [(x,y) for x in nums for y in nums] 
[(1, 1), (1, 2), (1, 3), (1, 4), (1, 5), (2, 1), (2, 2), (2, 3), (2, 4), (2, 5), (3, 1), (3, 2), (3, 3), (3, 4), (3, 5), (4, 1), (4, 2), (4, 3), (4, 4), (4, 5), (5, 1), (5, 2), (5, 3), (5, 4), (5, 5)] 
>>> min(_, key=lambda pair: pair[0]/pair[1]) 
(1, 5) 

ध्यान दें कि अजगर 2.5 पर इस चलाने के लिए आपको या तो तर्कों में से एक एक नाव बनाने की आवश्यकता होगी, या from __future__ import division करने के लिए ताकि 1/5 सही ढंग से 0,2 0.

+1

ध्यान दें कि मिनट के लिए 'कुंजी' तर्क केवल 2 के बाद स्वीकार किया जाता है।5 –

+0

मैं listcomp के बजाय ज़िप (nums, nums) का उपयोग करता, लेकिन अन्यथा यह मेरा समाधान होता। –

+1

असल में, ज़िप (अंक, संख्या) परिणाम [(1, 1), (2, 2), (3, 3), (4, 4), (5, 5)], जो सही नहीं है। – Kiv

3

के बजाय बराबर होती है कुछ पठनीय अजगर:

def JoeCalimar(l): 
    masterList = [] 
    for i in l: 
     for j in l: 
      masterList.append(1.*i/j) 
    pos = masterList.index(min(masterList)) 
    a = pos/len(masterList) 
    b = pos%len(masterList) 
    return (l[a],l[b]) 

मुझे पता है अगर कुछ नहीं है चलो स्पष्ट।

10

अगर मैं यह सोच कर कि आप एक सूची से 2 तत्वों के सभी संभव जोड़े के लिए एक समारोह का न्यूनतम मूल्य प्राप्त करना चाहते में सही हूँ ...

l = [1,2,3,4,5] 

def f(i,j): 
    return i+j 

# Prints min value of f(i,j) along with i and j 
print min((f(i,j),i,j) for i in l for j in l) 
+0

सूचियों का नाम "एल "मुझे थोड़ा सा फिक्र करें। अच्छा समाधान हालांकि :) – Kiv

+0

हाँ, मैं हमेशा अपनी जेनेरिक सूचियों 'lst' कहता हूं। –

+0

मैं अंत में एक [1:] जोड़ूंगा: प्रिंट मिनट ((1. * i/j, i, j) i में l में j के लिए l) [1:] –

2

यह mathy तरह से हो रहा है ...

nums = [1, 2, 3, 4, 5] 
min_combo = (min(nums), max(nums)) 

जब तक, बेशक, आप नकारात्मक वहाँ में है। उस स्थिति में, यह काम नहीं करेगा क्योंकि आप वास्तव में न्यूनतम और अधिकतम पूर्ण मूल्य चाहते हैं - संख्यात्मक शून्य के करीब होना चाहिए, और किसी भी दिशा में उससे दूर denominator। और डबल नकारात्मक इसे तोड़ देंगे।

+0

बीटीडब्लू, सवाल नहीं पूछता है। हां, यह प्रश्न में सरल उदाहरण का समाधान है, लेकिन यह नहीं कहता कि संख्याओं के जोड़े को कुछ फ़ंक्शन कैसे लागू करें। (या शायद इस उत्तर को पोस्ट करने के बाद प्रश्न में सुधार हुआ था।) – ToolmakerSteve

3

आप numpy पैकेज आयात करने से परहेज नहीं करते हैं, तो यह आदि सुविधाजनक में निर्मित कार्यक्षमता का एक बहुत है। यह बहुत अधिक कुशल सूचियों की सूची की तुलना में उनके डाटा संरचनाओं का उपयोग करने के होने की संभावना है,

from __future__ import division 

import numpy 

data = numpy.asarray([1,2,3,4,5]) 
dists = data.reshape((1,5))/data.reshape((5,1)) 

print dists 

which = dists.argmin() 
(r,c) = (which // 5, which % 5) # assumes C ordering 

# pick whichever is most appropriate for you... 
minval = dists[r,c] 
minval = dists.min() 
minval = dists.ravel()[which] 
1

अगर पायथन के साथ काम करने ≥2.6 (3.x सहित), आप कर सकते हैं:

from __future__ import division 
import operator, itertools 

def getmin(alist): 
    return min(
     (operator.div(*pair), pair) 
     for pair in itertools.product(alist, repeat=2) 
    )[1] 

getmin([1, 2, 3, 4, 5]) 

संपादित करें: अब मैं इसके बारे में सोचते हैं और अगर मैं अपने गणित सही ढंग से याद है, यह भी इस सवाल का जवाब सभी नंबरों कि यह सोचते देना चाहिए कि गैर-नकारात्मक हैं:

def getmin(alist): 
    return min(alist), max(alist) 
+1

यदि ओपी यूक्लिडियन दूरी की गणना करना चाहता है, तो itertools.combinations जनरेटर है जो इनपुट से अलग-अलग मानों के केवल अद्वितीय जोड़े उत्पन्न करेगा। – liori

+0

@ लिओरी: ओपी यूक्लिडियन दूरी नहीं लग रहा है। आपकी टिप्पणी के लिए धन्यवाद, वैसे भी, क्योंकि यह मुझे सवाल की याद दिलाता है। – tzot

0
>>> nums = [1, 2, 3, 4, 5]  
>>> min(map((lambda t: ((float(t[0])/t[1]), t)), ((x, y) for x in nums for y in nums)))[1] 
(1, 5) 
संबंधित मुद्दे