2014-12-04 4 views
2

Извините, если я получу терминологию неправильно - я только начал изучать Python, и я получаю инструкции от друзей, а не на фактическом курсе.Элементы поиска в массиве массивов

Я хочу найти список, содержащий множество массивов, содержащих несколько элементов, и найти массивы с соответствующими элементами, но некоторые разные.

В менее запутывающих условиях, например. У меня есть список массивов, каждый из которых содержит 2 элемента (я думаю, что это называется 2D массив?) Так:

list = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2], ...] 

В моем конкретном примере первые элементы в каждом суб массиве только вознестись линейно, а второй элементы почти случайны. Я хочу найти или отсортировать массивы только по второму числу. Я мог бы просто удалить первый номер из каждого массива:

list = [2, 2, 5, 1, 2 ...] 

И затем использовать что-то вроде «если список [х] == 1», чтобы найти «1» и т.д.
(побочное замечание: я не как найти ВСЕ значения, если одно значение повторяется - я не могу вспомнить то, что я написал, но он только найдет первый экземпляр, где значение будет соответствовать, например, он будет обнаруживать первый «2», но не второй или третий)

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

Так в моем примере, я надеялся, что, если бы я писал:

if list[[?, x]] == [?, 1] 

Тогда бы найти массив, где второе значение массива было 1, (т.е. [4, 1] в моем примере) и не заботятся о первом значении. Очевидно, это не сработало, потому что '?' не является синтаксисом Python, насколько мне известно, но, надеюсь, вы можете видеть, что я пытаюсь сделать?

Таким образом, для более общем случае, если у меня был список из 5 мерных массивов, и я хотел найти второе и четвертое значение каждого массива, я бы написать:

if list[[?, x, ?, y, ?]] == [?, a, ?, b, ?] 

И это будет соответствовать любому массив, где значение второго элемента было «a», а значение четвертого - «b».

например. [3, a, 4, b, 7], [20, a, 1, b, 9], ['cat', a, 'dog', b, 'fish'] и т. Д. Все возможные результаты, команда.

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

+0

Что вы подразумеваете под «array»: Python 'array.array', Python' list' или 'numpy.ndarray'? – Evert

+0

«Я думаю, это называется 2D-массив?» Здесь я бы назвал это списком списков. Используйте 'numpy', если вам нужны более правильные 2D-массивы. – Evert

+1

И еще одна команда: * никогда * не используйте встроенные ключевые слова для имен переменных (т. Е. Не используйте здесь 'list' в качестве переменной). – Evert

ответ

1

Используйте sorted, если вы хотите сохранить оригинальный list незатронутый

lst = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
In [103]: sorted(lst, key=lambda x: x[1]) 
Out[103]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 

еще использовать list.sort сортировать текущий список и держать упорядоченный список

In [106]: lst.sort(key=lambda x: x[1]) 
In [107]: lst 
Out[107]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 

или использовать operator.itemgetter

from operator import itemgetter 
In [108]: sorted(lst, key=itemgetter(1)) 
Out[108]: [[4, 1], [1, 2], [2, 2], [5, 2], [3, 5]] 
0

You может использовать, чтобы создать список всех желаемых пунктов:

In [16]: seq = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 

Для того, чтобы найти все элементы, где второй элемент 1:

In [17]: [pair for pair in seq if pair[1] == 1] 
Out[17]: [[4, 1]] 

Это находит все элементы, где второй элемент 2:

In [18]: [pair for pair in seq if pair[1] == 2] 
Out[18]: [[1, 2], [2, 2], [5, 2]] 

Вместо

if list[[?, x, ?, y, ?]] == [?, a, ?, b, ?] 

вы могли бы использовать

[item for item in seq if item[1] == 'a' and item[3] == 'b'] 

Однако следует отметить, что каждый раз, когда вы используете список понимание, Python должен цикл через все элементы seq. Если вы делаете это поиск несколько раз, вы могли бы быть лучше строить Dict:

import collections 
seq = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
dct = collections.defaultdict(list) 
for item in seq: 
    key = item[1] 
    dct[key].append(item) 

И тогда вы могли бы получить доступ к вещи, как это:

In [22]: dct[1] 
Out[22]: [[4, 1]] 

In [23]: dct[2] 
Out[23]: [[1, 2], [2, 2], [5, 2]] 

В список понимание

[pair for pair in seq if pair[1] == 1] 

приблизительно эквивалентен

result = list() 
for pair in seq: 
    if pair[1] == 1: 
     result.append(pair) 

в том смысле, что result будет равнозначно пониманию списка.

Пояснение по спискам - это просто синтаксически красивый способ выразить то же самое, что и .

В списке понимание выше, состоит из трех частей:

[expression for-loop conditional] 

Выражение pair, для-петли for pair in seq, и условное является if pair[1] == 1.

Большинство, but not all список осмысливает этот синтаксис. Полная грамматика понимания списка - given here.

+0

Спасибо за ответ. Не могли бы вы сломать, что означает «предмет для предмета в seq, если товар» означает? (И какая «пара для пары в seq, если пара» означает, если это другое?) Да, я упомянул, что мой друг кратко рассказал мне о словарях, но из того, что я могу сказать, похоже, что их использование ограничено 2D-списки и где один элемент просто увеличивается в стоимости линейно - то есть 2D-список, где обе переменные являются случайными в каждом под-списке, не будет работать, потому что может быть несколько или нулевые совпадения для заданного ключа ... – Patrik333

+0

I ' Мы добавили объяснение синтаксиса понимания списка. Обязательно прочитайте ссылки на документы для более полного объяснения. – unutbu

2

Для сортировки на втором элементе для списка списков (с указанной или кортежей):

from operator import itemgetter 
mylist = [[1, 2], [2, 2], [3, 5], [4, 1], [5, 2]] 
sortedlist = sorted(mylist, key=itemgetter(1)) 

См Python sorting howto.

+0

Спасибо за ответ. Что именно это делает/как вы используете эту функцию? Кроме того, я бы предпочел использовать более «базовые» шаги вместо более мощных функций - мне удалось решить задачу моего друга (который был «найти режим случайного списка») просто путем поиска функции «mode», и вся моя программа была всего лишь 3 строки, но я хотел попробовать ее, используя только более простые функции, которые мой друг показал мне (для циклов, если утверждения и т. д.) ... – Patrik333

+0

Простые функции выписывания отлично подходят для изучения алгоритмов, но если вы хотите изучить Python и программирование, то держать вещи короткими и понятными, возможно, лучше подходит. Иногда одно предложение переводит прямо в одну строку кода Python: «найдите режим случайного списка» -> 'scipy.stats.mstats.mode (data)'. Таким образом, ответ здесь зависит от вашего учебного контекста: StackOverflow предназначен для практических ответов на актуальные проблемы, тогда как, например, [программисты] (http://programmers.stackexchange.com/questions/tagged/algorithms) могут помочь вам в вопросах об алгоритмах. – Evert

+0

Я не знаю, я хочу научиться программированию, но когда я что-то пишу, я хочу знать, как это работает. Мой папа также программист и рассказал мне однажды о том, как он работает вплоть до двоичного/машинного кода. Думаю, я не хочу идти так далеко, но он чувствует себя почти как обман, чтобы подключить функцию, которая целая программа сама по себе, не выполняя то, что на самом деле выполняет функция. Думаю, я понял, что мой друг задал вопрос: «Напишите программу, чтобы найти режим списка», поэтому просто использование функции режима не будет писать мою собственную программу, она просто будет использовать чей-то написанный текст – Patrik333

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