【问题标题】:Ordering a leader board numerically by wins按获胜次数排序排行榜
【发布时间】:2017-03-23 17:29:16
【问题描述】:

我的文本文件布局如下:名字、姓氏、胜负

杰克,霍弗隆,5,6

zack,macker,0,11

alex,hof,11,0

dex,gerred,2,9

cassy,comp,1,10

import csv
cho_two=int(input('gg:'))

class_a = open("prac2.txt")
csv_a = csv.reader(class_a)
a_list = []
for row in csv_a:
    row[0] = int(row[2])
    row[1] = int(row[2])
    row[2] = int(row[2])
    row[3] = int(row[2])
    a_list.append(row[0:3])
if cho_two == 1:
    numerical = [[x[0]] for x in a_list]
    print("\nCLASS A\nEach students highest by numerical order \n")
    for alpha_order in sorted(numerical, reverse=True):
        #csv_a.append(alpha_order)
        print(alpha_order)

class_a.close()

我正在尝试根据玩家获得的胜利次数来排序排行榜,并过滤掉没有获得单次胜利的玩家,我已经得到了排序胜利的结果,但我不知道如何将玩家信息附加到正确的中奖金额。

【问题讨论】:

    标签: python python-3.x


    【解决方案1】:

    首先,我将通过将数据读入字典来创建一个名称 -> 胜负映射。

    >>> with open('prac2.txt') as f:
    ...     stats = {}
    ...     for line in f:
    ...         first_name, last_name, wins, losses = line.split(',')
    ...         name = '{} {}'.format(first_name, last_name)
    ...         stats[name] = {'wins': int(wins), 'losses': int(losses)}
    ... 
    >>> stats
    {'zack macker': {'wins': 0, 'losses': 11}, 'jack hofferon': {'wins': 5, 'losses': 6}, 'dex gerred': {'wins': 2, 'losses': 9}, 'alex hof': {'wins': 11, 'losses': 0}, 'cassy comp': {'wins': 1, 'losses': 10}}
    

    之后,遍历字典中按获胜次数排序的项目,如果玩家至少获胜一次,则打印出相关信息。下面是它的样子:

    >>> sorted_items = sorted(stats.items(), key=lambda x: x[1]['wins'], reverse=True)
    >>> for name, info in sorted_items:
    ...     wins = info['wins']
    ...     if wins > 0:
    ...         print('{} {}'.format(name, wins))
    ... 
    alex hof 11
    jack hofferon 5
    dex gerred 2
    cassy comp 1
    

    【讨论】:

      【解决方案2】:

      以下代码使用pythonOrderedDict

      import csv
      from collections import OrderedDict
      
      a_dict= {}
      with open('prac2.txt', 'rb') as csvfile: # User with open so no need to worry about forget closing the file.
          csv_data = csv.reader(csvfile)
          for row in csv_data:
              # dictionary key is first name, value is number of wins
              # You can combine fn and sn together as key
              a_dict[row[0]] = int(row[2])
      print "Unsorted"
      for k, v in a_dict.items():
           print "%s: %s" % (k, v)
      # Now sort by value in reverse order
      d_sorted_by_value = OrderedDict(sorted(a_dict.items(), key=lambda x: x[1],reverse=True))
      
      print "Sorted"
      for k, v in d_sorted_by_value.items():
           print "%s: %s" % (k, v)
      

      输出:

      Unsorted
      dex: 2
      cassy: 1
      alex: 11
      jack: 5
      zack: 0
      Sorted
      alex: 11
      jack: 5
      dex: 2
      cassy: 1
      zack: 0
      

      【讨论】:

        【解决方案3】:

        如果你对数据科学方法一无所知,我推荐 pandas

        import pandas as pd
        
        leaderboard = pd.read_csv('leaders.txt', header=None)
        #filter those who don't have any wins (0 in third column)
        leaderboard = leaderboard[leaderboard[2] > 0]
        #sort by third column
        leaderboard.sort(2, ascending = False)
        

        如果你想保存 csv,你只需 leaderboard.to_csv('ordered.txt', header=False)

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2015-11-22
          • 1970-01-01
          • 1970-01-01
          • 2019-03-22
          • 2014-05-24
          • 2015-01-29
          • 2019-08-04
          • 2015-04-13
          相关资源
          最近更新 更多