Python:按特定顺序对元组列表进行排序

时间:2016-12-13 01:14:02

标签: python list

我有以下可以以各种方式订购的元组列表。例如,它看起来像这样:

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)这些列表具有不同顺序的原因是因为它们是由字典构成的

4 个答案:

答案 0 :(得分:2)

我假设你的意思是你的数据是这样的:

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

也就是说,您有一个列表列表,每个列表都包含有效元组(您的示例不是有效的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"]]

答案 1 :(得分:1)

假设你有一个元组列表:

[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']

答案 2 :(得分:0)

这是一篇关于如何在python中进行排序的好的入门书:https://wiki.python.org/moin/HowTo/Sorting

你拥有的condensed_data没有所有条目?如果您只想获得精简数据,可能需要尝试列表推导,例如:

condensed_data = sorted([item[1] for item in data if item[1] in ('Derek Carr', 'Oakland Raiders')])

答案 3 :(得分:0)

您将元组(或字典)的第一部分与"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']