代码之家  ›  专栏  ›  技术社区  ›  Junaid

在python中查找与列表的col2中的值相关的col1中的最大值

  •  0
  • Junaid  · 技术社区  · 8 年前

    我是python新手。我想从col2中找出与列表col1中的值“men”、“women”和“people”相关的最大值。喜欢 ['men', 12, '1946-Truman.txt'], ['women', 7, '1946-Truman.txt'] ['people', 49, '1946-Truman.txt'] 包含男性、女性和人群的col2最大值。

    一种可能的解决方案是将这个元组列表转换为三个分别针对男性、女性和人群的数组,然后从所有数组中找到最大值。但是,我想要一个更好的解决方案。

    数据:

    [['men', 2, '1945-Truman.txt']
    ['women', 2, '1945-Truman.txt']
    ['people', 10, '1945-Truman.txt']
    ['men', 12, '1946-Truman.txt']
    ['women', 7, '1946-Truman.txt']
    ['people', 49, '1946-Truman.txt']
    ['men', 7, '1947-Truman.txt']
    ['women', 2, '1947-Truman.txt']
    ['people', 12, '1947-Truman.txt']
    ['men', 4, '1948-Truman.txt']
    ['women', 1, '1948-Truman.txt']
    ['people', 22, '1948-Truman.txt']
    ['men', 2, '1949-Truman.txt']
    ['women', 1, '1949-Truman.txt']
    ['people', 15, '1949-Truman.txt']
    ['men', 6, '1950-Truman.txt']
    ['women', 2, '1950-Truman.txt']
    ['people', 15, '1950-Truman.txt']
    ['men', 8, '1951-Truman.txt']
    ['women', 2, '1951-Truman.txt']
    ['people', 9, '1951-Truman.txt']
    ['men', 3, '1953-Eisenhower.txt']
    ['women', 0, '1953-Eisenhower.txt']
    ['people', 17, '1953-Eisenhower.txt']]
    

    提前谢谢。

    7 回复  |  直到 8 年前
        1
  •  2
  •   Anderson Lima    8 年前

    pandas 很好,但你可以 max lambda :

    men = max(data, key=lambda x: x[1] if x[0] == 'men' else 0)
    women = max(data, key=lambda x: x[1] if x[0] == 'women' else 0)
    people = max(data, key=lambda x: x[1] if x[0] == 'people' else 0)
    
        2
  •  2
  •   mozzafunk    8 年前

    您可以使用 pandas 包装。 通过定义数据框:

    import pandas as pd
    df = pd.DataFrame([['men', 2, '1945-Truman.txt'],
                       ['women', 2, '1945-Truman.txt'],
                       ['people', 10, '1945-Truman.txt'],
                       ['men', 12, '1946-Truman.txt'],
                        ['women', 7, '1946-Truman.txt'],
                       ['people', 49, '1946-Truman.txt'],
                       ['men', 7, '1947-Truman.txt'],
                       ['women', 2, '1947-Truman.txt'],
                       ['people', 12, '1947-Truman.txt'],
                       ['men', 4, '1948-Truman.txt'],
                       ['women', 1, '1948-Truman.txt'],
                       ['people', 22, '1948-Truman.txt'],
                       ['men', 2, '1949-Truman.txt'],
                       ['women', 1, '1949-Truman.txt'],
                       ['people', 15, '1949-Truman.txt'],
                       ['men', 6, '1950-Truman.txt'],
                       ['women', 2, '1950-Truman.txt'],
                       ['people', 15, '1950-Truman.txt'],
                       ['men', 8, '1951-Truman.txt'],
                       ['women', 2, '1951-Truman.txt'],
                       ['people', 9, '1951-Truman.txt'],
                       ['men', 3, '1953-Eisenhower.txt'],
                       ['women', 0, '1953-Eisenhower.txt'],
                       ['people', 17, '1953-Eisenhower.txt']])
    

    然后

    df.groupby([0], sort=False)[1].max()
    

    回来

    0 
    men       12
    women      7
    people    49
    Name: 1, dtype: int64
    

    这就是你想要的吗?

        3
  •  1
  •   Zack Tarr    8 年前

    如果您使用的列表包括:

    lst=[['men', 2123, '1945-Truman.txt'],
    ['women', 2, '1945-Truman.txt'],
    ['people', 10, '1945-Truman.txt'],
    ['men', 12, '1946-Truman.txt'],
    ['women', 7, '1946-Truman.txt'],
    ['people', 49, '1946-Truman.txt'],
    ['men', 7, '1947-Truman.txt'],
    ['women', 2, '1947-Truman.txt']]
    

    然后可以使用以下代码。

    max_men=0
    max_women=0
    max_people =0
    for item in lst:
        if((item[0]=="men") and (item[1]>max_men)):
            max_men=item[1]
        elif((item[0]=="women") and (item[1]>max_women)):
            max_women=item[1]
        elif((item[0]=="people") and (item[1]>max_people)):
            max_people=item[1]
    
    print max_men
    print max_women
    print max_people
    

    这将进入名为 lst 并为男人、女人和人们找到最大的价值。

        4
  •  1
  •   Maurice Meyer    8 年前

    您可以创建第一列的集合,然后找到最大值:

    data = [
        ['men', 2, '1945-Truman.txt'],
        ['women', 2, '1945-Truman.txt'],
        ...
    ]
    
    keys = set([col[0] for col in data])
    
    for k in keys:
            print (k, max([col[1] for col in data if col[0] == k]))
    

    返回值:

    women 7
    people 49
    men 12
    
        5
  •  1
  •   Ajax1234    8 年前

    您可以使用 itertools.groupby :

    import itertools
    new_data = [(a, list(b)) for a, b in itertools.groupby(sorted(data, key=lambda x:x[0]), key=lambda x:x[0])]
    new_final_data = [max(b, key=lambda x:x[1]) for a, b in new_data]
    

    输出:

    [['men', 12, '1946-Truman.txt'], ['people', 49, '1946-Truman.txt'], ['women', 7, '1946-Truman.txt']]
    

    或者,每个键都有一个字典,每个键的类型为:

    new_final_data = {a:max(b, key=lambda x:x[1]) for a, b in new_data}
    

    输出:

    {'women': ['women', 7, '1946-Truman.txt'], 'men': ['men', 12, '1946-Truman.txt'], 'people': ['people', 49, '1946-Truman.txt']}
    
        6
  •  1
  •   Colonel Beauvel    8 年前

    您可以使用 pandas 我想是吧 数据 是一个列表:

    import pandas as pd
    
    df = pd.DataFrame(data)
    
    df.loc[df.groupby([0])[1].idxmax()]
    
            0   1                2
    3     men  12  1946-Truman.txt
    5  people  49  1946-Truman.txt
    4   women   7  1946-Truman.txt
    

    对于相同格式的结果:

    df.loc[df.groupby([0])[1].idxmax()].values.tolist()
    
    [['men', 12, '1946-Truman.txt'], ['people', 49, '1946-Truman.txt'], ['women', 7, '1946-Truman.txt']]
    
        7
  •  1
  •   Willem    8 年前
    men = [t for t in yourlist if t[0] == 'men']
    women = [t for t in yourlist  if t[0] == 'women']
    people = [t for t in yourlist  if t[0] == 'people']
    sorted(men, key=operator.itemgetter(1), reverse=True)[0][1]
    sorted(women, key=operator.itemgetter(1), reverse=True)[0][1]
    sorted(people, key=operator.itemgetter(1), reverse=True)[0][1]