日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > python >内容正文

python

python 判断数字连续_关于python:检测列表中的连续整数

發(fā)布時(shí)間:2025/3/15 python 24 豆豆
生活随笔 收集整理的這篇文章主要介紹了 python 判断数字连续_关于python:检测列表中的连续整数 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本問題已經(jīng)有最佳答案,請(qǐng)猛點(diǎn)這里訪問。

我有一個(gè)包含這樣的數(shù)據(jù)的列表:

[1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]

我想打印出連續(xù)整數(shù)的范圍:

1-4, 7-8, 10-14

是否有內(nèi)置/快速/高效的方法?

請(qǐng)參閱stackoverflow.com/questions/2154249/,它將您指向docs.python.org/library/itertools.html#examples

家庭作業(yè)? 您向我們展示您嘗試過的方法,并看看我們是否可以做得更好。

謝謝,我應(yīng)該在問之前發(fā)現(xiàn):/

沒問題,并不是那么容易找到-我只是偶然記得看到它。 您的問題并非完全相同,因?yàn)槟谕妮敵鲇行┎煌?/p>

從文檔:

>>> from itertools import groupby

>>> from operator import itemgetter

>>> data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]

>>> for k, g in groupby(enumerate(data), lambda (i, x): i-x):

... ? ? print map(itemgetter(1), g)

...

[1]

[4, 5, 6]

[10]

[15, 16, 17, 18]

[22]

[25, 26, 27, 28]

您可以很容易地調(diào)整它,以獲取一組打印范圍。

不要忘記import itertools。此外,這僅適用于Python 2.4及更高版本。

實(shí)際上,至少在Python 2.6中,您將需要from itertools import *和from operator import *(或同等功能)。

不要使用星級(jí)進(jìn)口!切勿使用星級(jí)進(jìn)口!使用from itertools import groupby和from operator import itemgetter代替。

將lambda更改為lambda ix : ix[0] - ix[1],它可以在Python 3和Python 2中使用(嗯,不計(jì)算print語句)。

我打算對(duì)這個(gè)答案表示贊同,因?yàn)樗苈斆?。不幸的?#xff0c;如果我沒有解釋代碼的作用/工作原理,就太聰明了。

如果您的輸入列表中有重復(fù)項(xiàng)(例如[0,1,1,2]),則此方法將不會(huì)對(duì)整個(gè)序列進(jìn)行聚類;您需要先將list(set(my_original_list))調(diào)用到列表中,然后才能將其提供給此函數(shù)以獲取條紋0,1,2

對(duì)于所有嘗試使用Python 3的代碼的人,請(qǐng)閱讀@Kevin的注釋。另外,由于您實(shí)際上需要使用list(),因此打印語句將不起作用,如您在此處看到的stackoverflow.com/questions/7731213/基本上,您應(yīng)該在Python 3中使用print(list(map(itemgetter(1), g)))

@ dominic-rodger,如何從groupby()傳遞索引,以便獲得值列表,但又獲得對(duì)應(yīng)索引的另一個(gè)列表?我感覺這是可能的,因?yàn)槟诿杜e(),但無法實(shí)現(xiàn)。

這將完全按照您指定的方式打印:

>>> nums = [1, 2, 3, 4, 7, 8, 10, 11, 12, 13, 14]

>>> ranges = sum((list(t) for t in zip(nums, nums[1:]) if t[0]+1 != t[1]), [])

>>> iranges = iter(nums[0:1] + ranges + nums[-1:])

>>> print ', '.join([str(n) + '-' + str(next(iranges)) for n in iranges])

1-4, 7-8, 10-14

如果列表具有單個(gè)數(shù)字范圍,則它們將顯示為n-n:

>>> nums = [1, 2, 3, 4, 5, 7, 8, 9, 12, 15, 16, 17, 18]

>>> ranges = sum((list(t) for t in zip(nums, nums[1:]) if t[0]+1 != t[1]), [])

>>> iranges = iter(nums[0:1] + ranges + nums[-1:])

>>> print ', '.join([str(n) + '-' + str(next(iranges)) for n in iranges])

1-5, 7-9, 12-12, 15-18

這需要更多的選票。相當(dāng)優(yōu)雅!

一個(gè)簡(jiǎn)短的解決方案,無需額外導(dǎo)入即可使用。它接受任何迭代,對(duì)未排序的輸入進(jìn)行排序,并刪除重復(fù)項(xiàng):

def ranges(nums):

nums = sorted(set(nums))

gaps = [[s, e] for s, e in zip(nums, nums[1:]) if s+1 < e]

edges = iter(nums[:1] + sum(gaps, []) + nums[-1:])

return list(zip(edges, edges))

例:

>>> ranges([2, 3, 4, 7, 8, 9, 15])

[(2, 4), (7, 9), (15, 15)]

>>> ranges([-1, 0, 1, 2, 3, 12, 13, 15, 100])

[(-1, 3), (12, 13), (15, 15), (100, 100)]

>>> ranges(range(100))

[(0, 99)]

>>> ranges([0])

[(0, 0)]

>>> ranges([])

[]

這與@dansalmo的解決方案相同,我發(fā)現(xiàn)了驚人的解決方案,盡管有點(diǎn)難以閱讀和應(yīng)用(因?yàn)樗鼪]有作為函數(shù)給出)。

注意,它可以很容易地修改為吐出"傳統(tǒng)的"開放范圍[start, end),例如。更改return語句:

return [(s, e+1) for s, e in zip(edges, edges)]

sehr nett @coldfix

內(nèi)置:據(jù)我所知,沒有。

您必須遍歷數(shù)組。首先將第一個(gè)值放在變量中并打印出來,然后只要不斷按下下一個(gè)數(shù)字,除了記住另一個(gè)變量中的最后一個(gè)數(shù)字,什么都不會(huì)做。如果下一個(gè)號(hào)碼不符合要求,請(qǐng)檢查記住的最后一個(gè)號(hào)碼與第一個(gè)號(hào)碼。如果相同,則什么也不做。如果不同,則打印"-"和最后一個(gè)數(shù)字。然后將當(dāng)前值放在第一個(gè)變量中,然后重新開始。

在數(shù)組的末尾,您運(yùn)行相同的例程,就好像碰到了一個(gè)不符合要求的數(shù)字一樣。

我當(dāng)然可以編寫代碼,但是我不想破壞您的作業(yè):-)

使用設(shè)置操作,可以執(zhí)行以下算法

def get_consecutive_integer_series(integer_list):

integer_list = sorted(integer_list)

start_item = integer_list[0]

end_item = integer_list[-1]

a = set(integer_list) ?# Set a

b = range(start_item, end_item+1)

# Pick items that are not in range.

c = set(b) - a ?# Set operation b-a

li = []

start = 0

for i in sorted(c):

end = b.index(i) ?# Get end point of the list slicing

li.append(b[start:end]) ?# Slice list using values

start = end + 1 ?# Increment the start point for next slicing

li.append(b[start:]) ?# Add the last series

for sliced_list in li:

if not sliced_list:

# list is empty

continue

if len(sliced_list) == 1:

# If only one item found in list

yield sliced_list[0]

else:

yield"{0}-{1}".format(sliced_list[0], sliced_list[-1])

a = [1, 2, 3, 6, 7, 8, 4, 14, 15, 21]

for series in get_consecutive_integer_series(a):

print series

上面的列表" a"的輸出

1-4

6-8

14-15

21

我有一個(gè)類似的問題,正在將以下內(nèi)容用于排序列表。它輸出具有字典中列出的值范圍的字典。鍵將連續(xù)數(shù)字的每次運(yùn)行分開,也按順序排列數(shù)字之間的非連續(xù)項(xiàng)目的運(yùn)行總數(shù)。

您的列表給了我{0: [1, 4], 1: [7, 8], 2: [10, 14]}的輸出

def series_dictf(index_list):

from collections import defaultdict

series_dict = defaultdict(list)

sequence_dict = dict()

list_len = len(index_list)

series_interrupts = 0

for i in range(list_len):

if i == (list_len - 1):

break

position_a = index_list[i]

position_b = index_list[i + 1]

if position_b == (position_a + 1):

sequence_dict[position_a] = (series_interrupts)

sequence_dict[position_b] = (series_interrupts)

if position_b != (position_a + 1):

series_interrupts += 1

for position, series in sequence_dict.items():

series_dict[series].append(position)

for series, position in series_dict.items():

series_dict[series] = [position[0], position[-1]]

return series_dict

您可以使用具有稱為Counter的類的集合庫(kù)。如果嘗試輪詢?nèi)魏慰傻牟煌氐臄?shù)量,則計(jì)數(shù)器可以派上用場(chǎng)

from collections import Counter

data = [ 1, 4,5,6, 10, 15,16,17,18, 22, 25,26,27,28]

cnt=Counter(data)

print(cnt)

此輸出看起來像

Counter({1: 1, 4: 1, 5: 1, 6: 1, 10: 1, 15: 1, 16: 1, 17: 1, 18: 1, 22: 1, 25: 1, 26: 1, 27: 1, 28: 1})

就像其他字典一樣,可以查詢鍵值

多數(shù)民眾贊成在根本沒有回答問題,您只計(jì)算發(fā)生的次數(shù)而OP要求ranges

這是不使用任何模塊的另一種基本解決方案,非常適合面試,通常在他們不使用任何模塊的情況下進(jìn)行面試:

#!/usr/bin/python

def split_list(n):

"""will return the list index"""

return [(x+1) for x,y in zip(n, n[1:]) if y-x != 1]

def get_sub_list(my_list):

"""will split the list base on the index"""

my_index = split_list(my_list)

output = list()

prev = 0

for index in my_index:

new_list = [ x for x in my_list[prev:] if x < index]

output.append(new_list)

prev += len(new_list)

output.append([ x for x in my_list[prev:]])

return output

my_list = [1, 3, 4, 7, 8, 10, 11, 13, 14]

print get_sub_list(my_list)

輸出:

[[1], [3, 4], [7, 8], [10, 11], [13, 14]]

總結(jié)

以上是生活随笔為你收集整理的python 判断数字连续_关于python:检测列表中的连续整数的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。