【问题标题】:How do I create a deck of cards in terms of the number in a file in python?如何根据python文件中的数字创建一副卡片?
【发布时间】:2020-06-05 05:48:20
【问题描述】:

这是文件:

Admiral,30,1
General,25,1
Colonel,20,2
Major,15,2
Captain,10,2
Lieutenant,7,2
Sergeant,5,4
Corporal,3,6
Private,1,10

我需要显示牌组(以列表形式)并输出有多少张牌。文件中的最后一个数字表示有多少张卡片。所以甲板上有 1 张海军上将卡,2 张上校,10 张列兵,等等。

以下是我目前的代码:

numFile = open("ranks.dat", "r")

#list fields
rankList = []
skillList = []
numberList = []

while True:
    text = numFile.readline()
    text = text.rstrip("\n")
    if text=="":
        break
    info = text.split(",")
    rankList.append(info[0])
    skillList.append(int(info[1]))
    numberList.append(int(info[2]))


numFile.close

print("Rank\t\tSkill\t\tNumber")
print(45*"=")
for i in range(len(rankList)):
    print("%-10s\t%3i\t\t%3i" %(rankList[i], skillList[i], numberList[i]))

如何添加卡片组列表?

如何在列表中添加卡片组?列表应该是这样的:

========================================
        Level 3 Build Deck
========================================
['Admiral', 'General', 'Colonel', 'Colonel', 'Major', 'Major', 'Captain', 'Captain', 'Lieutenant', 'Lieutenant', 'Sergeant', 'Sergeant', 'Sergeant', 'Sergeant', 'Corporal', 'Corporal', 'Corporal', 'Corporal', 'Corporal', 'Corporal', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private']


【问题讨论】:

  • 那段代码有什么问题
  • @jonrsharpe 该代码没有问题,我需要从文件中添加卡片组列表,但我不知道该怎么做
  • 那么您能否改写您的问题 - 或打开一个新问题 - 以从 Python 中读取文件。理想情况下,请给我们一个您要阅读的文件的示例。
  • @mrblewog 是的,我可以做到这一点,我如何给你一个你想阅读的文件的例子——有什么方法可以附加吗?我把文件的内容放在文件的顶部,够了吗?
  • 您的代码似乎可以正常显示文件示例中的牌组。您是否只缺少显示卡片总数?卡数刚好sum([int(x) for x in numberList])

标签: python


【解决方案1】:

重构发布的软件

以下简化发布的代码并创建相同的输出

注意:重命名文件ranks.txt(即txt文件通常以txt结尾 后缀)。

with open("ranks.txt", "r") as f:
  rankList, skillList, numberList = zip(*[x.rstrip().split(',') for x in f])

skillList = [int(x) for x in skillList]
numberList = [int(x) for x in numberList]

print("Rank\t\tSkill\t\tNumber")
print(45*"=")
for i in range(len(rankList)):
    print("%-10s\t%3i\t\t%3i" %(rankList[i], skillList[i], numberList[i]))

建立套牌列表

Inspired by

建造甲板

deck = [rank for rank, number in zip(rankList, numberList) for i in range(number)]
print(deck)

或者等效地使用 for 循环

deck = []
for i in range(len(rankList)):
  rank = rankList[i]
  number = numberList[i]
  for repeat in range(number):
    deck.append(rank)

输出

['Admiral', 'General', 'Colonel', 'Colonel', 'Major', 'Major', 'Captain', 'Captain', 'Lieutenant', 'Lieutenan
t', 'Sergeant', 'Sergeant', 'Sergeant', 'Sergeant', 'Corporal', 'Corporal', 'Corporal', 'Corporal', 'Corporal
', 'Corporal', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Private', 'Priva
te', 'Private']

说明

构建套牌列表理解

deck = [rank for rank, number in zip(rankList, numberList) for repeat in range(number)]

创建排名对的序列和该排名的数量

zip(rankList, numberList)

遍历这些对

 for rank, number zip(rankList, numberList)

根据每对中的number 重复排名

 [rank for rank, number in zip(rankList, numberList) for repeat in range(number)]

完整的软件

numFile = open("ranks.dat", "r")

#list fields
rankList = []
skillList = []
numberList = []

while True:
    text = numFile.readline()
    text = text.rstrip("\n")
    if text=="":
        break
    info = text.split(",")
    rankList.append(info[0])
    skillList.append(int(info[1]))
    numberList.append(int(info[2]))

numFile.close

print("Rank\t\tSkill\t\tNumber")
print(45*"=")
for i in range(len(rankList)):
    print("%-10s\t%3i\t\t%3i" %(rankList[i], skillList[i], numberList[i]))

deck = []
for i in range(len(rankList)):
  rank = rankList[i]
  number = numberList[i]
  for repeat in range(number):
    deck.append(rank)

print(deck)

【讨论】:

  • @DarryIG 无论如何不使用迭代?和拉链?我从来没学过
  • @unknownmac--当然--我会用普通的 for 循环来扩展。
  • @unknownmac--添加了使用 for 循环的版本。有意义吗?
  • @DarryIG 非常感谢!现在当我运行它时,它没有显示任何东西。也许我犯了一个错误?
  • @DarryIG numFile = open("ranks.dat", "r") #list fields rankList = [] SkillList = [] numberList = [] deck = [] while True: text = numFile。 readline() text = text.rstrip("\n") if text=="": break info = text.split(",") for i in range(len(rankList)): rank = rankList[i] number = numberList[i] for repeat in range(number): deck.append(rank) numFile.close
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2021-12-09
  • 2022-01-23
  • 2020-07-27
  • 2020-10-14
相关资源
最近更新 更多