【问题标题】:Python: How to print a list with labels for each item within the listPython:如何为列表中的每个项目打印带有标签的列表
【发布时间】:2015-03-19 23:57:51
【问题描述】:

我正在为我的 Intro to CSC 课程做一个 python 项目。我们得到一个 .txt 文件,它基本上是 200,000 行的单个单词。我们必须逐行读取文件,并计算字母表中每个字母作为单词首字母出现的次数。我已经计算出计数并将其存储在列表中。但现在我需要以格式打印它

"a:10,898 b:9,950 c:17,045 d:10,596 e:8,735
f:11,257 .... " 

另一个方面是它必须每行打印 5 个字母计数,就像我在上面所做的那样。

这就是我目前正在使用的......

def main():
    file_name = open('dictionary.txt', 'r').readlines()
counter = 0
    totals = [0]*26
    alphabet = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 'x', 'y', 'z']
    for i in file_name:
        for n in range(0,26):
            if i.startswith(alphabet[n]):
                totals[n] = totals[n]+1
    print(totals)

main()

此代码当前输出

[10898, 9950, 17045, 10675, 7421, 7138, 5998, 6619, 6619, 7128, 1505, 1948, 5393, 10264, 4688, 6079, 15418, 890, 10790, 20542, 9463, 5615, 2924, 3911, 142, 658]

【问题讨论】:

  • 我想我应该补充一下,这就是它目前给我的 [10898, 9950, 17045, 10675, 7421, 7138, 5998, 6619, 6619, 7128, 1505, 1948, 5393, 10264 , 4688, 6079, 15418, 890, 10790, 20542, 9463, 5615, 2924, 3911, 142, 658]

标签: python list file


【解决方案1】:

我会强烈推荐使用dictionary 来存储计数。它将大大简化您的代码,并使其快得多。我会把它作为练习留给你,因为这显然是家庭作业。 (其他提示:Counter 更好)。另外,现在你的代码只对小写字母是正确的,而不是大写字母。您需要添加额外的逻辑来将大写字母视为小写字母,或独立处理它们。现在你只需忽略它们。

话虽如此,以下将为您当前的格式完成:

print(', '.join('{}:{}'.format(letter, count) for letter, count in zip(alphabet, total)))

zip 采用 n 个列表并生成一个包含 n 个元素的新元组列表,每个元素都来自一个输入列表。 join 使用提供的分隔符将字符串列表连接在一起。 format 使用格式说明符使用提供的值填充字符串中的值。

【讨论】:

  • 在实验室作业中,我的教授提供了一些提示。这些是前两个...“假设 w 是列表单词中的一个单词,要将第一个字母 a-z 转换为 0-25 范围,请使用内置函数 ord() 并从 ' 的序数值中减去该值a'.ord(w[0])-ord('a') 使用 26 个零的列表来保存每个字母的计数。索引可以映射到字母表中的字母。递增对应于第一个字母的索引字典中的每个单词。”我不太明白他的意思。
  • @zachcapp ord() 返回字符的 ASCII/UTF8 值。因此,例如,ord('a') == 97。在 ASCII/UTF8 字符空间中,所有小写字母都是连续的,从 'a' 开始到 97,并以 'z' 结束在 122。如果我从任何其他小写字母的ord() 值中减去'a'ord() 值,我将得到0-25 范围内的一个数字,这将允许您直接索引到计数数组。
  • 如果它解决了您的问题,请接受答案(单击旁边的灰色复选标记),以便其他可能有类似问题的人知道这解决了它。
  • 谢谢。现在关于我的问题的另一个细节..如何让它在每打印 5 个项目后开始一个新行?
【解决方案2】:

python 3.4

解决方法是循环读取文件的行到下面的words变量中,使用Counter

from collections import Counter
import string

words = 'this is a test of functionality'
result = Counter(map(lambda x: x[0], words.split(' ')))
words = 'and this is also very cool'
result = result + Counter(map(lambda x: x[0], words.split(' ')))

counters = ['{letter}:{value}'.format(letter=x, value=result.get(x, 0)) for x in string.ascii_lowercase]

如果您打印计数器

['a:3', 'b:0', 'c:1', 'd:0', 'e:0', 'f:1', 'g:0', 'h:0 '、'i:2'、'j:0'、'k:0'、'l:0'、'm:0'、'n:0'、'o:1'、'p:0'、 'q:0'、'r:0'、's:0'、't:3'、'u:0'、'v:1'、'w:0'、'x:0'、'y :0', 'z:0']

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-07-07
    • 2014-07-09
    相关资源
    最近更新 更多