Python:在有序列表中找到最小的缺失正整数

时间:2016-08-31 13:07:00

标签: python python-3.x

我需要在列表中找到第一个缺失的数字。如果没有号码丢失,则下一个号码应该是最后一个号码。

应首先检查第一个数字是否为> 1,如果是,则新号码应为1。

这是我尝试过的。问题出在这里:ProcessExists(wchar_t* processName) { DWORD aProcesses[1024], cbNeeded, cProcesses; unsigned int i; if ( !EnumProcesses( aProcesses, sizeof(aProcesses), &cbNeeded ) ) { return false; } // Calculate how many process identifiers were returned. cProcesses = cbNeeded / sizeof(DWORD); // Print the name and process identifier for each process. for ( i = 0; i < cProcesses; i++ ) { if( aProcesses[i] != 0 ) { PrintProcessNameAndID( aProcesses[i] ); } } return false; } void PrintProcessNameAndID( DWORD processID ) { TCHAR szProcessName[MAX_PATH] = TEXT("<unknown>"); // Get a handle to the process. HANDLE hProcess = OpenProcess( PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, processID ); // Get the process name. if (NULL != hProcess ) { HMODULE hMod; DWORD cbNeeded; if ( EnumProcessModules( hProcess, &hMod, sizeof(hMod), &cbNeeded) ) { GetModuleBaseName( hProcess, hMod, szProcessName, sizeof(szProcessName)/sizeof(TCHAR) ); } } // Print the process name and identifier. dprintf( TEXT("%s (PID: %u) %s %s\n"), szProcessName, processID ); // Release the handle to the process. CloseHandle( hProcess ); } 导致错误,因为在结尾和开头我有一个if next_value - items > 1:

None

另一种方法:

list = [1,2,5]
vlans3=list

for items in vlans3:
    if items in vlans3:

        index = vlans3.index(items)
        previous_value = vlans3[index-1] if index -1 > -1 else None
        next_value = vlans3[index+1] if index + 1 < len(vlans3) else None
        first = vlans3[0]
        last = vlans3[-1]

                #print ("index: ", index)
        print ("prev item:", previous_value)
        print ("-cur item:", items)
        print ("nxt item:", next_value)

        #print ("_free: ", _free)
        #print ("...")
        if next_value - items > 1:
            _free = previous_value + 1
            print ("free: ",_free)
            break

print ("**************")
print ("first item:", first)
print ("last item:", last)
print ("**************")
如果数字之间存在间隙,则

会产生正确的数字,但如果没有剩余空格,则会出现错误:L = vlans3 free = ([x + 1 for x, y in zip(L[:-1], L[1:]) if y - x > 1][0]) 。但是我需要以某种方式指定如果没有可用空间,它应该给出一个新的数字(最后+1)。但是使用下面的代码会出错,我不知道为什么。

IndexError: list index out of range

3 个答案:

答案 0 :(得分:1)

获取不属于vlans3成员的最小整数:

ints_list = range(min(vlans3), max(vlans3) + 1)
missing_list = [x for x in ints_list if x not in vlans3]
first_missing = min(missing_list)

但是,如果列表中的最小值大于1,则返回1;如果没有缺失值,则返回最后一个值+ 1,因此这将变为:

ints_list = [1] + list(range(min(vlan3), max(vlan3) + 2))
missing_list = [x for x in ints_list if x not in vlan3]
first_missing = min(missing_list)

答案 1 :(得分:0)

首先避免使用保留字list作为变量。 第二次使用尝试:除了快速,整齐地避免这种问题。

def free(l):
    if l == []: return 0
    if l[0] > 1: return 1
    if l[-1] - l[0] + 1 == len(l): return l[-1] + 1
    for i in range(len(l)):
        try:
            if l[i+1] - l[i] > 1: break
        except IndexError:
            break
    return l[i] + 1

答案 2 :(得分:0)

fetch('https://dl.dropboxusercontent.com/s/v2pca6kq8nsqmso/abb5c48dae55560e4ae7d41af7bfdc50.jpg?raw=1', { method: 'GET', mode: 'cors', cache: 'no-cache', credentials: 'same-origin', headers: {}, referrer: 'no-referrer', }).then(x => x.blob().then(y => console.log(y)))解决方案如何?如果您的输入是一个具有不重复正值(或为空)的排序的整数列表,则下面的代码有效。

对于小型输入,

nekomatic 的解决方案要快一些,但仅需不到一秒钟,并不重要。但是,它不适用于较大的输入-例如numpy通过包含检查完全冻结了列表的理解。下面的代码没有这个问题。

list(range(1,100000))
  1. 在数组前加上-1和0,因此import numpy as np def first_free_id(array): array = np.concatenate((np.array([-1, 0], dtype=np.int), np.array(array, dtype=np.int))) where_sequence_breaks = np.where(np.diff(array) > 1)[0] return where_sequence_breaks[0] if len(where_sequence_breaks)>0 else array[-1]+1 适用于空列表和1元素列表,而不会破坏现有序列的连续性。
  2. 计算连续值之间的差异。寻求不连续点(“孔”)的差异大于1。
  3. 如果有任何“空洞”,则返回第一个的id,否则返回最后一个元素之后的整数。