2017-07-17 49 views
0

我需要根據健身對有機體列表進行排序。這可能是最簡單的事情,但我遇到了麻煩。這裏超級業餘。在Python中實現遺傳算法:使用健身對列表進行排序

這是我的代碼:

import random as randint 

pop_size = int(raw_input('Enter a population size:')) 
length = int(raw_input('Enter an orgnaism length:')) 

for i in range(pop_size): 
    org = [] 
    for a in range(length): 
     org.append(randint.randint(0,1)) 
    print org 
    fitness = sum(org) 

print sorted(org, key=fitness) 

我得到的錯誤:

Traceback (most recent call last): 
    File "<stdin>", line 16, in <module> 
TypeError: 'int' object is not callable 

的解釋將是很有益:)

編輯:這是Python的2.7.2

+0

你想要的清單列表按其值的總和排序?在您的代碼中,您將多次覆蓋組織列表,然後僅嘗試從最後一次迭代中打印列表。 – SuperShoot

+0

是的,我需要一個列表按其值排序 – tony

+0

檢查我的答案,看看這是什麼意思。 – SuperShoot

回答

0

key關鍵詞參數需要是一個函數。所以如果你有一個列表的話,你可以使用fitness = lambda x: x['fitness']這樣的排序方式來排序fitness鍵。此外,也許這只是複製/粘貼的錯誤,但每當你經歷循環時你都在重新定義健身。

+0

我必須使用字典嗎?還是我可以使用列表? – tony

+0

如果您願意,您可以使用列表清單。 'list.sort(key = lambda x:x [1])'或者真的是任何東西的列表,只要你用這樣的可調用函數調用關鍵字就可以了。可調用函數的另一個例子(在這裏不起作用)是'datetime.now'。 –

+0

org.sort(key = lambda fitness:fitness [1])那樣? – tony

1

你是不是通過人口規模收集在每次迭代中生成的列表:

import random as randint 

pop_size = int(input('Enter a population size:')) 
length = int(input('Enter an orgnaism length:')) 

orgs = [] 
for i in range(pop_size): 
    org = [] 
    for a in range(length): 
     org.append(randint.randint(0,1)) 
    orgs.append(org) 

print sorted(orgs, key=sum) 

這可能是使用列表理解有點清潔:

import random as randint 

pop_size = int(input('Enter a population size:')) 
length = int(input('Enter an orgnaism length:')) 

orgs = [[randint.randint(0,1) for a in range(length)] for i in range(pop_size)] 

print sorted(orgs, key=sum)