2014-08-30 3 views
1

Я хотел бы нарезать набор в списке, но каждый раз, когда я делаю это, я получаю пустой список в ответ.python slice set in list

то, что я пытаюсь выполнить (может быть, есть более простой способ):

  • я получил список наборов
  • каждый комплект имеет 5 пунктов
  • я хотел бы сравнить новый набор против список (если набор уже существует в списке)
  • первый и последний элемент в наборе не имеет значения для сравнения, поэтому для поиска уже существующих наборов действительны только позиции 2-4

здесь не мой код:

result_set = ['1', '2', '3', '4', '5'] 

result_matrix = [] 

result_matrix.append(result_set) 

нарезка набор не является проблемой:

print result_set[1:4] 

['2', '3', '4'] 

print result_matrix[:][1:4] 

[] 

я бы ожидать:

[['2', '3', '4']] 
+2

Вы имели в виду 'result_matrix [0] [1: 4]' вместо 'result_matrix [:] [1: 4]'? ИЛИ 'result_matrix.extend (result_set)' вместо 'result_matrix.append (result_set)'? – falsetru

+0

проблема заключается в том, что result_matrix [:] == result matrix. result_matrix имеет только один результат в нем, 0-й. Вы просите его, чтобы первый результат был установлен через 4-й результирующий набор, который является пустым. – turbulencetoo

+0

Я чувствую чувство долга, чтобы указать на это: 'result_set' - это список, а не набор. – SethMMorton

ответ

0

Я думаю, что это то, что вы хотите сделать:

>>> target_set = ['2', '3', '4'] 
>>> any([l for l in result_matrix if target_set == l[1:-1]]) 
True 
>>> target_set = ['1', '2', '3'] 
>>> any([l for l in result_matrix if target_set == l[1:-1]]) 
False 

Обобщая и делает, что функции:

def is_set_in_matrix(target_set, matrix): 
    return any(True for l in matrix if list(target_set) == l[1:-1]) 

>>> result_matrix = [['1', '2', '3', '4', '5']] 
>>> is_set_in_matrix(['1', '2', '3'], result_matrix) 
False 
>>> is_set_in_matrix(['2', '3', '4'], result_matrix) 
True 
# a quirk - it also works with strings...` 
>>> s = '234' 
>>> is_set_in_matrix(s, result_matrix) 
True 

Обратите внимание, что я использовал l[1:-1] игнорировать первый и последний элементы «набора» в сравнении. Это более гибко, если вам нужны наборы разной длины.

+0

Большое спасибо, это именно то, что мне нужно. Я изменил именно это: any ([l для l в result_matrix, если target_set ** [1: -1] ** == l [1: -1]]) – user3740082

1
>>> result_set = ['1', '2', '3', '4', '5'] 

>>> print result_set[1:4] 
['2', '3', '4'] 

>>> result_matrix.append(result_set[1:4]) 
>>> result_matrix 
[['2', '3', '4']] 
0

Использование result_matrix[:] возвращает всю матрицу, как это. Вам нужно обработать результат, который вы хотите, как часть массива.

>>> result_matrix.append(result_set) 
>>> result_matrix[:] 
[['1', '2', '3', '4']] 
>>> result_matrix[:][0] 
['1', '2', '3', '4'] 
>>> result_matrix[0][1:4] 
['2', '3', '4'] 

Кроме того, как отметил falsetru:

>>> result_matrix.extend(result_set) 
>>> result_matrix 
['1', '2', '3', '4'] 
>>> result_matrix[1:4] 
['2', '3', '4']