पूर्णांक की दो सूचियों को देखते हुए, जोड़े की सबसे छोटी सूची उत्पन्न करें जहां दोनों सूचियों में प्रत्येक मान मौजूद है। प्रत्येक जोड़ी का पहला भाग पहली सूची से एक मान होना चाहिए, और प्रत्येक जोड़ी का दूसरा भाग दूसरी सूची से एक मान होना चाहिए। प्रत्येक जोड़ी का पहला जोड़ी के दूसरे से कम होना चाहिए।सूचियों की एक जोड़ी से न्यूनतम जोड़े की सूची
सूचियां अलग-अलग लंबाई होती हैं, या यदि प्रत्येक सूची में एक ही स्थिति में एक ही पूर्णांक मौजूद होता है तो एक साधारण zip
काम नहीं करेगा। यहाँ
def gen_min_pairs(uplist, downlist):
up_gen = iter(uplist)
down_gen = iter(downlist)
last_up = None
last_down = None
while True:
next_out = next(up_gen, last_up)
next_down = next(down_gen, last_down)
if (next_up == last_up and
next_down == last_down):
return
while not next_up < next_down:
next_down = next(down_gen, None)
if next_down is None:
return
yield next_up, next_down
last_up = next_up
last_down = next_down
और एक साधारण परीक्षण दिनचर्या है:
def gen_min_pairs(uplist, downlist):
for pair in zip(uplist, downlist):
yield pair
यहाँ मैं अब तक के साथ आ सकता है
if __name__ == '__main__':
from pprint import pprint
datalist = [
{
'up': [1,7,8],
'down': [6,7,13]
},
{
'up': [1,13,15,16],
'down': [6,7,15]
}
]
for dates in datalist:
min_pairs = [pair for pair in
gen_min_pairs(dates['up'], dates['down'])]
pprint(min_pairs)
कार्यक्रम पहला सेट के लिए उत्पादन की उम्मीद पैदा करता है तिथियों के, लेकिन दूसरे के लिए विफल रहता है।
अपेक्षित:
[(1, 6), (7, 13), (8, 13)]
[(1, 6), (1, 7), (13, 15)]
वास्तविक:
[(1, 6), (7, 13), (8, 13)]
[(1, 6), (13, 15)]
मैं जबकि केवल एक बार प्रत्येक सूची के प्रत्येक तत्व को देखकर यह किया जा सकता है, लगता है तो जटिलता O(len(up) + len(down))
में। मुझे लगता है कि यह प्रत्येक सूची के लिए अद्वितीय संख्या तत्वों पर निर्भर करता है।
संपादित करें: मुझे यह जोड़ना चाहिए कि हम इन सूचियों को पहले सबसे छोटे पूर्णांक के साथ क्रमबद्ध करने की उम्मीद कर सकते हैं।
संपादित करें: uplist
और downlist
केवल मनमानी नाम थे। कम भ्रमित मनमानी वाले A
और B
हो सकते हैं।
from random import uniform, sample
from pprint import pprint
def random_sorted_sample(maxsize=6, pop=31):
size = int(round(uniform(1,maxsize)))
li = sample(xrange(1,pop), size)
return sorted(li)
if __name__ == '__main__':
A = random_sorted_sample()
B = random_sorted_sample()
min_pairs = list(gen_min_pairs(A, B))
pprint(A)
pprint(B)
pprint(min_pairs)
यह यादृच्छिक यथार्थवादी आदानों उत्पन्न करता है, उत्पादन की गणना करता है, और प्रदर्शित करता है सभी तीन सूचियां:
इसके अलावा, यहाँ एक और अधिक मजबूत परीक्षण दिनचर्या है।
[11, 13]
[1, 13, 28]
[(11, 13), (13, 28)]
[5, 15, 24, 25]
[3, 13, 21, 22]
[(5, 13), (15, 21), (15, 22)]
[3, 28]
[4, 6, 15, 16, 30]
[(3, 4), (3, 6), (3, 15), (3, 16), (28, 30)]
[2, 5, 20, 24, 26]
[8, 12, 16, 21, 23, 28]
[(2, 8), (5, 12), (5, 16), (20, 21), (20, 23), (24, 28), (26, 28)]
[3, 4, 5, 6, 7]
[1, 2]
[]
जब आप इसका उपयोग करते हैं तो यह करना चाहते हैं (1,6) और 7 तक जाता है, यह होना चाहिए (7,13) या यह होना चाहिए (7, कोई नहीं)। –
क्या आपका मतलब परीक्षण डेटा के पहले सेट या दूसरे के लिए है?डेटा के पहले सेट के लिए आउटपुट ठीक है; अगर जोड़ी '(7,13)' को जोड़ी '(1,7)' के साथ बदल दिया गया था, तो यह अभी भी ठीक रहेगा। दूसरे सेट के लिए आउटपुट गलत है क्योंकि किसी भी जोड़ी में '7' मौजूद नहीं है। एकमात्र वैध जोड़ी जिसमें इसे शामिल किया जा सकता है '(1,7)' है। एक जोड़ी में 'कोई नहीं' कभी नहीं दिखना चाहिए। –
दूसरी अपेक्षित सूची मानदंडों का उल्लंघन करती प्रतीत होती है। (13,15)? 16 कहां है? डेटा के दूसरे सेट के लिए – kevpie