मैं एक सूची में मूल्य खोजना चाहता हूं, जिसके बाद अन्य सभी मूल्य केवल 1 से बढ़ते हैं।

# Input
my_list1 = [2, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
my_list2 = [6, 7, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28]
my_list3 = [5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25]
# Output
my_list1 = 15
my_list2 = 20
my_list3 = 18

मैं सूचियों के माध्यम से पीछे की ओर लूप करने के बारे में सोच रहा था और जब कमी 1 से बड़ी हो, तो इस स्थिति में मान निकालें।

for x in reversed(my_list1):
    if x decrease > 1:
        print(x)
1
AennaPhD 25 जुलाई 2020, 22:52

8 जवाब

सबसे बढ़िया उत्तर

यहां एक itertools आधारित है, जो उपयोगी है यदि हमारे पास बहुत लंबी सूची है, इसलिए हमने इसे स्मृति में लोड नहीं किया है। यहां dropwhile पुनरावर्तनीय मानों को छोड़ देगा जबकि शर्त है, हमें केवल next तत्व को परिणामी पुनरावर्तनीय में लेने की आवश्यकता है। ध्यान दें कि next में एक डिफ़ॉल्ट तर्क है, जिसे हम StopIteration त्रुटि उत्पन्न होने से बचाने के लिए केवल None पर सेट कर सकते हैं:

from itertools import tee, dropwhile

def first_diff(it):
    i, j = tee(reversed(it), 2)
    next(j)
    return next((dropwhile(lambda e: e==(next(j)+1), i)), None)

first_diff(my_list1)
# 15
first_diff(my_list2)
# 20
first_diff(my_list3)
# 18
4
yatu 28 जुलाई 2020, 11:21

आप zip() reversed() सूचियों को जोड़े में बनाएं, फिर next() पहली जोड़ी प्राप्त करने के लिए जहां अंतर 1 से अधिक है। फिर हम अनपैक कर सकते हैं परिणाम से पहला आइटम।

def first_diff_pair(lst):
    return next(
        (fst for fst, snd in zip(reversed(lst), reversed(lst[:-1])) if fst - snd > 1),
        None,
    )

जब कोई परिणाम नहीं मिलता है और इटरेटर समाप्त हो जाता है तो next() StopIteration लौटने से बचने के लिए, हम डिफ़ॉल्ट मान को None पर सेट कर सकते हैं।

आउटपुट:

>>> first_diff_pair([2, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24])
15
>>> first_diff_pair([6, 7, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28])
20
>>> first_diff_pair([5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25])
18
2
RoadRunner 26 जुलाई 2020, 10:22

सूची समझ के साथ कई संभावनाएं हैं। यहां मैं हर संख्या को इकट्ठा करता हूं जो एक से अधिक बढ़ जाती है, उन्हें एक सूची में संग्रहीत करती है और आखिरी दिखाती है:

print([my_list1[i+1] for i in range(len(my_list1)-1) if my_list1[i+1] - my_list1[i] > 1][-1])
print([my_list2[i+1] for i in range(len(my_list2)-1) if my_list2[i+1] - my_list2[i] > 1][-1])
print([my_list3[i+1] for i in range(len(my_list3)-1) if my_list3[i+1] - my_list3[i] > 1][-1])
1
Ronald 25 जुलाई 2020, 23:05

खैर, मैंने यह कोशिश की, और यह काम कर गया, लेकिन इसके लिए बेहतर और अधिक कुशल समाधान भी हो सकते हैं,

l = len(my_list1) - 1
for x in reversed(my_list1):
    if my_list1[l] - my_list1[l - 1] == 1:
      l -= 1
      continue
    else:
      print(x)
      break
1
Suryansu Dash 25 जुलाई 2020, 23:06

यहां एक बुनियादी लूप-आधारित कार्यान्वयन है।

def get_first_diff(my_list):
    reversed_iter = reversed(my_list)
    last = next(reversed_iter)
    for v in reversed_iter:
        if last - v != 1:
           return last
        last = v
    return None
1
GZ0 26 जुलाई 2020, 09:59

यह एक समाधान है जिसमें कोई डुप्लिकेट कोड नहीं है:

my_list1 = [2, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]
my_list2 = [6, 7, 9, 11, 12, 14, 16, 17, 18, 20, 21, 22, 23, 24, 25, 26, 27, 28]
my_list3 = [5, 6, 7, 8, 9, 11, 12, 13, 15, 16, 18, 19, 20, 21, 22, 23, 24, 25]

def getIncreaseStartPoint(nums):
  i = len(nums) - 1
  while (nums[i] - nums[i - 1] == 1):
    i -= 1
    if (i == 0):
      return nums[0]
  return nums[i]

print("mylist_1 =", getIncreaseStartPoint(my_list1))
print("mylist_2 =", getIncreaseStartPoint(my_list2))
print("mylist_3 =", getIncreaseStartPoint(my_list3))
0
Mobina 25 जुलाई 2020, 23:23

यहाँ मेरा प्रयास है:

my_list1 = [2, 5, 7, 8, 9, 10, 11, 12, 13, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24]

tmplist = [x - i for i, x in enumerate(my_list1)]
first = my_list1[tmplist.index(tmplist[-1])]
# result 15

यह काम किस प्रकार करता है:

# tmplist is [2, 4, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6]

दोहराई जाने वाली संख्याएँ मूल सूची में बढ़ते क्रम (+1 द्वारा) के स्थान दिखाती हैं। अंतिम आइटम (tmplist[-1]) 6 है, हम ऐसे पहले आइटम (tmplist.index(...)) की स्थिति प्राप्त करना चाहते हैं, क्योंकि वहां अनुक्रम शुरू होता है। अंत में हम उस सूचकांक पर मूल्य देखते हैं (my_list1[...])

0
VPfB 26 जुलाई 2020, 08:52

अनुक्रम में अनुपलब्ध संख्याओं के आधार पर विभाजित सूची के समान, आप itertools.groupby संख्याओं के क्रमागत रनों को समूहीकृत करने के लिए, और वहां से प्रथम मान प्राप्त करने के लिए आखरी बार:

from itertools import groupby

my_list = [2, 5, 7,8,9,10,11,12,13, 15,16,17,18,19,20,21,22,23,24]
first_value = None
for _, group in groupby(enumerate(my_list), lambda x: x[1] - x[0]):
    first_value = next(group)[1]
print(first_value)
# 15
0
Georgy 27 जुलाई 2020, 13:14