2014-12-21 2 views
-1

Является динамическим решением для проблемы kp. У меня проблема с типом, когда для генератора для сжатия. Это, безусловно, список, но он говорит, что это целое число, я везде искал, но не могу найти решение. Могу ли я помочь?Python: List is int, TypeError

import itertools 

def kpdynamic1(max_weight, iterable): 
    ''' 
    Dynamic solution kp 
    :param max_weight: int 
    ''' 
    K = [(0, [(0, 0)])] 

    # debug 
    print type(iterable) 
    print iterable 

    for w in range(1, max_weight + 1): 
     l = [(0, [(0, 0)])] + \ 
      [(K[w - weight][0] + value, K[w - weight][1] + [(value, weight)]) 
      for (value, weight) in 
      itertools.compress(iterable, 
           (1 if (weight <= w) else 0 
           for (value, weight) in iterable))] 
     K += max(l, key=lambda x: x[0]) 
    return K[max_weight] 


if __name__ == '__main__': 
    max_size = 30 
    values = (3, 1.9, 30) 
    sizes = (3, 2, 14) 

    iterable = zip(values, sizes) 

    out = kpdynamic1(max_size, iterable) 

OUT:

Traceback (most recent call last): 
..., line .. 
out = kpdynamic1(max_size, iterable) 
..., line .. 
for (value, weight) in iterable))] 
TypeError: 'int' object has no attribute '__getitem__' 
<type 'list'> 
[(3, 3), (1.9, 2), (30, 14)] 

ответ

1

Вы простирающийся K с одним элементом из l:

K += max(l, key=lambda x: x[0]) 

, где l содержит кортежи. Обратите внимание, что я сказал , распространяющийся, а не добавление; элементы , содержащиеся в этом один максимальный кортеж добавляются, а не сам кортеж:

>>> K = [] 
>>> K += (0, 0) 
>>> K 
[0, 0] 

Таким образом вы в конечном итоге с отдельными целыми числами K, которые вы затем пытаются лечить как последовательности:

[(K[w - weight][0] + value, K[w - weight][1] + [(value, weight)]) 

Здесь K[...] возвращает целое число, поэтому K[...][0] не удастся.

Вместо расширения с += используйте K.append():

K.append(max(l, key=lambda x: x[0])) 

или обернуть результат max() в списке одного элемента:

K += [max(l, key=lambda x: x[0])] 

С этого измените функцию дает результат:

>>> import itertools 
>>> def kpdynamic1(max_weight, iterable): 
...  K = [(0, [(0, 0)])] 
...  for w in range(1, max_weight + 1): 
...   l = [(0, [(0, 0)])] + \ 
...    [(K[w - weight][0] + value, K[w - weight][1] + [(value, weight)]) 
...    for (value, weight) in 
...    itertools.compress(iterable, 
...         (1 if (weight <= w) else 0 
...         for (value, weight) in iterable))] 
...   K.append(max(l, key=lambda x: x[0])) 
...  return K[max_weight] 
... 
>>> max_size = 30 
>>> values = (3, 1.9, 30) 
>>> sizes = (3, 2, 14) 
>>> iterable = zip(values, sizes) 
>>> kpdynamic1(max_size, iterable) 
(61.9, [(0, 0), (30, 14), (30, 14), (1.9, 2)]) 
Смежные вопросы