2016-10-28 1 views
0

Я имею дело с некоторой загадкой и надеялся на некоторую ясность. Я написал сценарий для поиска кости комбинаций рулонных добавление к 24, который выглядит следующим образом:Создание неожиданного значения кортежа

start=[3,3,3,3,3,3,3,3] 
outcomes=set(tuple(start)) #Use a set to ensure uniqueness 

index_list=np.random.randint(0,8,1000) 

#This little snippet adds one and subtracts one randomly, keeping total at 24 
for i in xrange(0,500): 
    upper=index_list[i] 
    downer=index_list[i+20] 

    if start[upper]!=6 and start[downer]!=1: 
     start[upper]=start[upper]+1 
     start[downer]=start[downer]-1 
     outcomes.add(tuple(start)) 

print outcomes 

То, что я бегу в, в том, что когда я смотрю на результаты, есть один 3 типа «INT» в там.

set([(4, 4, 4, 3, 2, 2, 2, 3), 3, (2, 5, 4, 3, 1, 4, 2, 3), (4, 4, 4, 2, 3, 1, 3, 3),(4, 2, 5, 2, 3, 4, 1, 3)]) 

Хотя я мог бы, конечно, удалить его, мне просто любопытно, как он туда начинает? Мое первоначальное предположение заключалось в том, что индексный список может создавать индекс за пределами [0-7], но это не так. Я искал аналогичный вопрос в других местах, но еще не нашел подобной проблемы. Благодаря!

ответ

1

set ожидает итерабельность. Вы передаете tuple, который является итерируемым. set выполняет итерацию через него, оставляя всего 1 значение: 3 (потому что ваш кортеж содержит только одно значение 3).

Вы должны поместить свой элемент в виде списка или кортежа, так что рассматривается как один элемент (точно такой же проблемой, когда вы передаете строку и неожиданно итерацию на)

Остальная часть вашего кода ОК и не имеет ничего общего с проблемой.

ли это вместо:

outcomes=set([tuple(start),]) 

теперь set итерацию по списку 1 кортежа, фактически создавая tuple элементы.

Вы можете сделать это также, возможно, проще:

outcomes=set() 
outcomes.add(tuple(start)) 

нет никакой двусмысленности, так как вы добавляете 1 элемент. Это не повторяется.

+0

Ahh, что имеет смысл! Кто бы ни запустил это, почему вы это сделали? Разве это не питонический способ сделать это, или есть еще одна причина для его понижения? –

+0

Я собирался прокомментировать нижестоящую. Кто-то, кто неправильно понял вопрос ... Я тоже не понимаю. –

+1

@MasonGardner Я не сделал ни слова, но причина, по которой я не поднял голову, состоит в том, что объяснение на мой взгляд мало вводит в заблуждение. 'set' ожидает итерабельность, но [tuples * are * iterables] (https://docs.python.org/2/glossary.html#term-iterable) - этот ответ звучит так, как будто это не так. Причина, по которой вы получаете '3', состоит в том, что это единственное уникальное значение в' (3, 3, 3, 3, 3, 3, 3, 3) '. – elethan

Смежные вопросы