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

data = [ ("name", "Derek Carr"),
         ("college", "Fresno State"),
         ("jersey", 4),
         ("team", "Oakland Raiders") ]

Или вот так:

data = [ ("college", "Fresno State"),
         ("jersey", 4),
         ("name", "Derek Carr"),
         ("team", "Oakland Raiders") ]

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

condensed_data = ["Derek Carr", "Oakland_Raiders"]

РЕДАКТИРОВАТЬ: (1) Список данных исправлен. (2) Причина, по которой эти списки имеют различный порядок, состоит в том, что они составлены из словарей

-1
Johnny Metz 13 Дек 2016 в 04:14

4 ответа

Лучший ответ

Предполагая, что у вас есть список кортежей:

[v for key in ["name", "team"] for k, v in data if k == key]
# ['Derek Carr', 'Oakland Raiders']

Или вы можете использовать обычные циклы:

lst = []
for key in ['name', 'team']:
    for k, v in data:
        if k == key:
            lst.append(v)

lst
# ['Derek Carr', 'Oakland Raiders']
1
Psidom 13 Дек 2016 в 02:02

Вот хороший учебник по сортировке в python: https://wiki.python.org/ МойнМойн / HowTo / сортировка.

condensed_data у вас есть хотя не все записи? Если вы хотите получить только сжатые данные, вы можете попробовать составить список, например:

condensed_data = sorted([item[1] for item in data if item[1] in ('Derek Carr', 'Oakland Raiders')])
0
David542 13 Дек 2016 в 01:19

Вы сравниваете первую часть вашего кортежа (или слова) с "name" и "team" и, если она совпадает, вставляете вторую часть в ваш condensed_data. Не нужно ничего сортировать здесь.

Например:

res = [None, None]

for tup in data:
    if tup[0] == 'name':
        res[0] = tup[1]
    elif tup[0] == 'team':
        res[1] = tup[1]

>>> print(res)
['Derek Carr', 'Oakland Raiders']
0
MSeifert 13 Дек 2016 в 01:19

Я предполагаю, что вы имеете в виду, что ваши данные выглядят так:

people = [
          [("name", "Derek Carr"),
           ("college", "Fresno State"),
           ("jersey", 4),
           ("team", "Oakland Raiders")],
          [("college", "Fresno State"),
           ("jersey", 4),
           ("name", "Derek Carr"),
           ("team", "Oakland Raiders")]
         ]

То есть у вас есть список списков, каждый из которых содержит valid кортежи (ваши примеры не были допустимыми Python).

Во-первых, мы собираемся преобразовать каждый список кортежей в словарь, отображающий ключи в значения:

data = map(dict, people)

Теперь мы можем извлечь только ту информацию, которую вы хотите на человека:

for p in data:
    p_data = [p["name"], p["team"]]

data = [("name", "Derek Carr"),
        ("college", "Fresno State"),
        ("jersey", 4),
        ("team", "Oakland Raiders")]
person_data = dict(data)
result = [person_data["name"], person_data["team"]]
2
Rushy Panchal 13 Дек 2016 в 01:22