मैं जांचना चाहता हूं कि मेरी दी गई सूची 1 से बढ़ रही है या नहीं

इसलिए:

[1,2,3,4] = True [1,3,4,5] = False

और यदि संभव हो तो मैं इसे कुछ पायथन विशिष्ट कार्यों के साथ करना चाहता हूं - इसलिए यदि संयोजन के साथ इसे लूप नहीं करना है, लेकिन सभी की तरह कुछ (... सूची में मूल्यों के लिए)

मुझे लगता है, यह स्पष्ट है

1
Dominik Lemberger 14 नवम्बर 2019, 18:54

5 जवाब

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

इस बारे में कैसा है?

def has_stepsize_one(it):
    return all(x2 - x1 == 1 for x1, x2 in zip(it[:-1], it[1:]))
>>> has_stepsize_one([1,2,3,4])
True

>>> has_stepsize_one([1,3,4,5])
False

यह किसी भी संग्रह के साथ काम करना चाहिए, न कि केवल सूचियों के साथ।

ध्यान रखें कि यह दो से कम तत्वों वाले संग्रह के लिए True लौटाता है:

>>> has_stepsize_one([1])
True

>>> has_stepsize_one([])
True

यदि आप ऐसा नहीं चाहते हैं, तो आपको इटरेटर की लंबाई जांचनी होगी।

सामान्य पुनरावृत्तियों के लिए जो getitem का समर्थन नहीं करते, itertools.count से तुलना करना शायद सबसे अच्छा तरीका है (काया3 का जवाब):

import itertools

def has_stepsize_one(it):
    it = iter(it)
    try:
        first = next(it)
    except StopIteration:
        return True

    return all(x == y for x, y in zip(it, itertools.count(first + 1)))
>>> has_stepsize_one((i for i in range(10)))
True
5
Dion 14 नवम्बर 2019, 19:44

इसकी तुलना range से क्यों न करें

l == list(range(l[0], l[-1] + 1))
3
modesitt 14 नवम्बर 2019, 19:02

यह एक एकल कार्य नहीं है लेकिन आप इसका उपयोग कर सकते हैं:

lst = [1,2,3,4]
print(lst == list(range(lst[0],lst[-1]+1,1)))
True

lst = [1,3,4,5]
print(lst == list(range(lst[0],lst[-1]+1,1)))
False
2
Andreas 14 नवम्बर 2019, 19:02

पूरी सूची की तुलना करें:

if my_list == list(range(my_list[0], my_list[0] + len(my_list)))
    # do things

या सूची में ही गणना के साथ तुलना करें:

if all(entry - 1 == my_list[i-1] or i == 0 for i, entry in enumerate(my_list))

जहाँ i == 0 पहले पुनरावृत्ति के लिए जाँच करता है, जो हमेशा सत्य होता है, क्योंकि एक भोले-भाले लूप में len(my_list) पुनरावृत्ति होगी जबकि हम केवल len(my_list) - 1 तुलना करते हैं।

2
Gloweye 15 नवम्बर 2019, 11:35

अधिकांश अन्य उत्तर एक नई सूची बनाकर काम करते हैं, जिसमें O(n) समय और O(n) सहायक स्थान लगता है। all, range और zip का उपयोग करके O(1) सहायक स्थान के साथ ऐसा करना संभव है। यह समाधान शॉर्ट-सर्किट भी करता है, इसलिए सर्वोत्तम स्थिति में O(1) समय लगता है।

def is_ascending(lst):
    # special case: an empty list is ascending
    if not lst:
        return True

    start = lst[0]
    end = start + len(lst)
    # general case: an ascending list equals a range
    return all( x == y for x, y in zip(lst, range(start, end)) )

परीक्षण:

>>> is_ascending([1, 2, 3, 4])
True
>>> is_ascending([1, 3, 4, 5])
False
>>> is_ascending([23])
True
0
kaya3 14 नवम्बर 2019, 19:31