2015-02-15 3 views
2

Я хочу проверить, равна ли строка 1 столбцу, а вторая строка равна столбцу 2 и так далее. Если матрица равна его транспонированию.Я хочу проверить, одинаковы ли мои строки и столбцы

Я попытался решить проблему, используя следующий код, но функция не возвращает ни одного. Может кто-нибудь помочь мне с этим

x = [[1, 2, 3], 
    [2, 3, 4], 
     [3, 4, 1]] 

def rows(matrix): 
    list = [val for val in matrix] 
    list1 = [i for i in zip(*matrix)] 
    if list == list1: 
     return True 
    else: 
     return False 

rows(x) 

ответ

1

zip функция возвращает список кортежей:

>>> x = [[1, 2, 3], 
     [2, 3, 4], 
     [3, 4, 1]] 
>>> zip(*x) 
[(1, 2, 3), (2, 3, 4), (3, 4, 1)] 
>>> x == zip(*x) 
False 

список не равен кортеж, даже если он имеет те же элементы. Список списков не равен списку кортежей, даже если внутренние списки/кортежи содержат одни и те же элементы. Вы можете делать то, что хотите, и вы были рядом!

>>> x == [list(i) for i in zip(*x)] 
True 
2

zip возвращает кортежи, а не списки:

>>> [val for val in x] 
[[1, 2, 3], [2, 3, 4], [3, 4, 1]] 
>>> [i for i in zip(*x)] 
[(1, 2, 3), (2, 3, 4), (3, 4, 1)] 

И они не равными друг другу:

>>> [1,2,3] == (1,2,3) 
False 

Вместо этого, вы можете просто верните результаты сравнения после преобразования в списки:

>>> x == [list(i) for i in zip(*x)] 
True 
+0

Ну, это впечатляющие почти simulpost. – paidhima

+0

Получил это. Я не знаю, чей ответ принять. Ответ @paidhima похож на ваш – dangerous

+0

@ dangerous: в случае двух подобных подобных сообщений я, вероятно, соглашусь с тем, что пользователь более низкого представителя, потому что у них есть больше, чтобы выиграть, что в этом случае платиха. – DSM

0

Вы можете понять, что случилось с вашей программой, запустив этот: список

x = [[1, 2, 3],[2, 3, 4],[3, 4, 1]] 

def rows(matrix): 
    list = [val for val in matrix] 
    list1 = [i for i in zip(*matrix)] 
    print list 
    print list1 
    if list == list1: 
     return True 
    else: 
     return False 

print rows(x) 

print list Здесь печатают списки, а список print list1 отпечатков touples.

С lists и touples разные программы возвращаются False.

2

Использование map для отображения подсписков в кортежи и сравнить, отображение в кортеж Шоуд также быть более эффективным, чем изменение кортежей списков:

def rows(matrix): 
    return zip(*matrix) == map(tuple, matrix) 
+1

Да, ваш алгоритм заметно быстрее. На моем компьютере с частотой 2 ГГц, работающем на Python 2.6.6, я получаю: 'python -m timeit -n 100000 -r 3 -s" x = [[1, 2, 3], [2, 3, 4], [3, 4, 1]] "" zip (* x) == map (tuple, x) "' 100000 циклов, лучше всего 3: 5.76 usec за цикл. И 'python -m timeit -n 100000 -r 3 -s" x = [[1, 2, 3], [2, 3, 4], [3, 4, 1]] "" x == [list (i) для i в zip (* x)] "' 100000 циклов, лучше всего 3: 6,95 usec за цикл –

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