2016-05-25 57 views
0

我有一個函數,它包含一個列表和n個數字。我想創建這樣的事情:Python - 如何根據提供的n的數量添加局部變量

def create_list_sets(lst, n): 
    if n == 1: 
     for i in range(len(lst)-1): 
      res = [lst[i], lst[i+1]] 
      return res 
    if n == 2: 
     for i in range(len(lst)-1): 
      res2 = [lst[i], lst[i+1], lst[i+2]] 
      return res2 

只有我不想寫n == 2, n == 3... n == n。更具體地講,如果我的def create_list_sets(lst, n)需要n == 4我要資源來eqaul [lst[i], lst[i+1], lst[i+2], lst[i+3], lst[i+4]],沒有硬編碼這個

下面是完整的代碼我工作:

########### 
# Library # 
########### 

def number_to_be_tested(): 
    number_tested = 34278698769876978697687693454 
    return number_tested 


def number_split(object): 
    lst = [] 
    string_the_number = str(object) 
    for digit in string_the_number: 
     lst.append(int(digit)) 
    return lst 


def create_list_sets(lst, n): 
    if n == 1: 
     for i in range(len(lst)-1): 
      res = [lst[i], lst[i+1]] 
      return res 
    if n == 2: 
     for i in range(len(lst)-1): 
      res2 = [lst[i], lst[i+1], lst[i+2]] 
      return res2 

################################## 
# Script/Application/Program # 
################################## 

def main(): 
    test_number = number_to_be_tested() 
    test_lst = number_split(test_number) 
    list_sets = test_lst(test_lst, 2) 
    print list_sets 

if __name__ == '__main__': 
    main() 

我怎樣才能達到我的目標是什麼?也正如你所看到的,它會在程序結束時創建一個Traceback,我不關心這個atm - 那個說,如果你知道如何也能幫助我,我會非常感激。

+1

當函數打'return',它停止。在循環內返回並不會做你認爲它的作用。 – user2357112

+1

一個簡單的循環/理解可能起作用:'[lst [i + j] for j in range(n + 1)]'...'lst [i:i + n + 1]'我不是100%確定解決你的問題。你似乎在循環的第一次迭代之後返回,因此我不確定他們想要完成什麼。 – mgilson

+0

@mgilson,「他們正在努力完成的事情」是我試圖完成的。我正在學習python。對於這個自我分配,我從一個數字列表開始,並試圖將它們分解成2,3,4個集合,無論n是什麼。唯一的事情是,我想用列表中的每個項目開始每個集合。這將總共創建最多28個新列表(取決於n == 1或更多)。隨着我提供的代碼我能夠做到這一點,但只有當我指定了什麼n可以。因爲我剛開始,我描述自己想要的路線的能力可能有點不清楚。 – Lefty

回答

0

既然你知道ň並有充分的LST和n的值可以使用附加

def create_list_sets(lst, n): 
    res = [] 
    if n <= len(lst): 
     for i in range(n): 
      res.append([lst[i]) 
    return res 

注意,這裏假設你想要一個空單時n > len(lst)返回爲錯誤。如果你只是想重置n至len(lst)如果n過大,那麼使用

def create_list_sets(lst, n): 
    res = [] 
    if n >= len(lst): 
     n = len(lst) -1 
    for i in range(n): 
     res.append([lst[i], lst[i+1]]) 
    return res 

我的道歉不是具體的在我的問題。你的頭腦是正確的。我確實需要更多的功能。如果n == 4我想要你提供的。但我希望爲每個索引。所以:如果n == 2 - > res = [lst [0],lst [1]],[lst [1],lst [2]],[lst [2],lst [3]],[lst [ 3,LST [4]] ...] - 米克爾森3小時前

def create_list_sets(lst, n): 
    res = [] 
    if n > len(lst): 
     n = len(lst) 
    for k in range(len(lst) - n + 1) 
     tmp = [] 
     for i in range(n): 
      tmp.append(lst[i+k]) 
     res.append(tmp) 
    return res 

注意,內環可以用切片來代替

def create_list_sets(lst, n): 
    j = len(lst) 
    res = [] 
    if n > j: 
     n = j 
    for k in range(j - n + 1) 
     res.append(lst[k:k+n]) 
    return res 
+0

謝謝你的回答。我喜歡這種方法,但它似乎並沒有讓我迭代每個項目。 Id喜歡每個項目都有這種能力。這使我可以爲第一個索引做到這一點,但不是第二,第三,第四,一直到最後。 – Lefty

+0

@Lefty其實它遍歷所有的指標。給定任何n,它將創建從索引0到索引n-1的整個列表。那就是如果'n == 4'它會創建'res = [lst [0],lst [1],lst [2],lst [3]] Isn,那你想要什麼? – sabbahillel

+0

我的道歉沒有在我的問題具體。你的頭腦是正確的。我確實需要更多的功能。如果n == 4我想要你提供的。但我希望爲每個索引。因此:如果n == 2 - > res = [lst [0],lst [1]],[lst [1],lst [2]],[lst [2],lst [3]],[lst [3],lst [4]] ...] – Lefty

0

我猜你想要做什麼是根本:

lst = lst[:min(len(lst), n)] 

這會給你所有的元素,直到n-1或完整列表

0

您的代碼似乎是:

def create_list_sets(lst, n): 
    # multiple cases for value X 
    if n == X: 
     for i in range(len(lst)-1): 
      res = [lst[i], ..., lst[i+X]] 
      return res 

for執行循環只有一次,因爲你是return荷蘭國際集團的res式的變量。所以我會忽視整個循環,只考慮第一個值i,即零。

def create_list_sets(lst, n): 
    # multiple cases here for X 
    if n == X: 
     return [lst[0], ..., lst[0+n]] 

可能被重申如下:

def create_list_sets(lst, n): 
    return lst[:max(min(n, len(lst)), 0)+1]