【问题标题】:how to make each key-value of a dictionary print on a new line?如何使字典的每个键值在新行上打印?
【发布时间】:2013-12-09 12:28:13
【问题描述】:

如果我有这样的字典:

{'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}

如何将每个键值打印在新行上?

它很长,但这是我用来获取这本字典的代码。我几乎将每个键值添加到字典中。所以我想出了最短的单词,然后我把它加到字典里。我也注意到有额外的冒号。但我想出了它的值的一部分,我可以使用 .replace() 把它拿走??

def build_report(freq):
    report={}
    freq_list=list(freq.keys())
    keys=sorted(freq, key=len)
    #for shorts:
    shortest=keys[0]
    shortest = [keys[0]]
    for key in keys[1:]:
        if len(key) == len(shortest[0]):
            shortest.append(key)
        else:
            break   
    report["shorts:"]=shortest
    #for longs:
    longest=keys[-1]
    longest = [keys[-1]]
    for key in reversed(keys[:-1]):
        if len(key) == len(longest[0]):
            longest.append(key)
        else:
            break
    report["longs:"]=longest
    #for mode:
    val_list=list(freq.values())
    sorted_val_list=sorted(val_list)
    mode=sorted_val_list[-1]
    for key in freq.keys():
        if freq[key]==mode:
            mode_word=key
    report["mosts:"]=mode_word
    # for word count:
    wordcount=len(list(freq.keys()))
    report["count:"]=wordcount
    #for average length:
    avg=list(freq.keys())
    average=sum(map(len,avg))/len(avg)
    report["avglen"]=average
    #for freq dictionary of word to word count
    freqs=freq
    report["freqs:"]=freqs
    return report

【问题讨论】:

  • 请注意,您的键中似乎有剩余的冒号。我会看看你在做什么来生成那个字典。
  • @DSM 我添加了生成字典的代码

标签: python python-3.x dictionary


【解决方案1】:

如果您真的不想导入 pprint 但希望它“看起来像”字典,您可以这样做:

print("{" + "\n".join("{!r}: {!r},".format(k, v) for k, v in d.items()) + "}")

【讨论】:

  • 轻微补充:基于逗号的分隔符的放置必须扮演加入者的角色。 print("{" + ",\n".join("{!r}: {!r}".format(k, v) for k, v in d.items()) + "}")
  • @ShubhamSingh 我不会说它必须是 - 尾随逗号在 Python 中是有效的(例如 JavaScript,虽然不是在类似的 JSON 中)。
【解决方案2】:

您可能正在寻找pprint,漂亮的打印机标准库。例如:

import pprint
pprint.pprint({'avglen': 4.419354838709677, 
               'count:': 93,
               'mosts:': 'your',
               'longs:': ['stretched'],
               'shorts:': ['i', 'a'],})

输出

{'avglen': 4.419354838709677,
 'count:': 93,
 'longs:': ['stretched'],
 'mosts:': 'your',
 'shorts:': ['i', 'a']}

【讨论】:

    【解决方案3】:

    遍历dict.items 并打印:

    >>> d = {'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}
    >>> for k, v in d.items():
    ...     print (k, '-->', v)
    ...     
    mosts: --> your
    count: --> 93
    avglen --> 4.41935483871
    shorts: --> ['i', 'a']
    longs: --> ['stretched']
    

    或使用pprint 模块:

    >>> import pprint
    >>> pprint.pprint(d)
    {'avglen': 4.419354838709677,
     'count:': 93,
     'longs:': ['stretched'],
     'mosts:': 'your',
     'shorts:': ['i', 'a']}
    

    【讨论】:

    • 有没有办法在不导入任何东西的情况下做到这一点?第一个不会将其作为字典返回
    【解决方案4】:

    对于那些使用pprint 的人来说,想知道为什么您的字典仍然不会将每个条目打印到新行:可能是您的字典条目或整个字典太短了。在这种情况下,直接调用PrettyPrinter 类并相应地设置width 参数,如docs 中所指定:

    import pprint
    stuff = {'avglen': 4.41, 'count:': 93, 'shorts:': ['i', 'a']}
    pretty = pprint.PrettyPrinter(width=30)
    pretty.pprint(stuff)
    

    【讨论】:

      【解决方案5】:

      为了快速打印,您可以使用字符串替换将换行符放入输出中。如果字典包含列表,此方法不会给出漂亮的结果;这些列表也会换行。

      td = {'avglen': 4.419354838709677, 'count:': 93, 'mosts:': 'your', 'longs:': ['stretched'], 'shorts:': ['i', 'a'],}
      print(str(td).replace(', ',',\n '))
      

      输出

      {'avglen': 4.419354838709677,
       'count:': 93,
       'mosts:': 'your',
       'longs:': ['stretched'],
       'shorts:': ['i',
       'a']}
      

      【讨论】:

        【解决方案6】:

        在您过去的六个左右问题中,您似乎将这本糟糕的字典用作某种文本索引对象。为什么不让它成为一个合适的类?

        from collections import Counter
        
        textfreq = {
            'I': 1, 'heaven': 1, 'filled': 1, 'their': 1, 'termed': 1, 'of': 4,
            'And': 3, 'parts': 1, 'neer': 1, 'to': 2, 'song': 1, 'poets': 1,
            'The': 1, 'a': 2, 'were': 2, 'verse': 1, 'your': 6, 'knows': 1,
            'not': 1, 'half': 1, 'number': 1, 'but': 1, 'yours': 1, 'come': 2,
            'rage': 1, 'age': 2, 'Though': 1, 'men': 1, 'fresh': 1, 'heavenly': 1,
            'say': 1, 'alive': 1, 'truth': 1, 'this': 1, 'If': 2, 'than': 1,
            'old': 1, 'believe': 1, 'Which': 1, 'that': 1, 'You': 1, 'faces': 1,
            'yet': 1, 'poet': 1, 'in': 4, 'life': 1, 'most': 1, 'earthly': 1,
            'will': 1, 'hides': 1, 'my': 3, 'papers': 1, 'is': 1, 'stretched': 1,
            'rights': 1, 'eyes': 1, 'it': 3, 'yellowed': 1, 'Such': 1, 'So': 1,
            'all': 1, 'lies': 1, 'the': 1, 'an': 1, 'as': 1, 'write': 1,
            'child': 1, 'deserts': 1, 'shows': 1, 'tongue': 1, 'twice': 1,
            'Be': 1, 'high': 1, 'some': 1, 'could': 1, 'should': 2, 'and': 2,
            'touched': 1, 'like': 1, 'would': 1, 'Who': 1, 'tomb': 1, 'numbers': 1,
            'antique': 1, 'scorned': 1, 'metre': 1, 'time': 2, 'touches': 1,
            'be': 1, 'with': 2, 'true': 1, 'beauty': 1, 'rhyme': 1, 'less': 1,
            'But': 1, 'graces': 1, 'live': 1
        }
        
        class TextStats():
            def __init__(self, text=''):
                if hasattr(text, 'wordfreq'):
                    # copy an existing TextStats object
                    self.wordfreq = Counter(text.wordfreq)
                elif hasattr(text, 'keys'):
                    # load from an existing dict or Counter
                    self.wordfreq = Counter(text)
                else:
                    # parse from a string
                    # TO DO - strip all punctuation
                    self.wordfreq = Counter(w for w in text.lower().split() if w)
        
            @classmethod
            def from_file(cls, fname):
                with open(fname) as inf:
                    text = ' '.join(line.strip() for line in inf.readlines())
                    return cls(text.translate(None, '`~!@#$\'"'))
        
            def __add__(self, otherTextStats):
                return TextStats(self.wordfreq + otherTextStats.wordfreq)
        
            def __str__(self):
                return(
                   "Count:        {}\n"
                   "Average len:  {:0.4f}\n"
                   "Shortest:     {}\n"
                   "Most common:  {}\n"
                   "Longest:      {}\n".format(
                       self.total_words,
                       self.average_word_length,
                       self.shortest_words,
                       self.most_common_words,
                       self.longest_words
                   )
                )
        
            @property
            def unique_words(self):
                return len(self.wordfreq)
        
            @property
            def total_words(self):
                return sum(self.wordfreq.values())
        
            @property
            def total_letters(self):
                return sum(len(w)*c for w,c in self.wordfreq.items())
        
            @property
            def average_word_length(self):
                return float(self.total_letters) / self.total_words
        
            @property
            def shortest_words(self):
                minlen = len(min(self.wordfreq, key=len))
                return sorted(w for w in self.wordfreq if len(w)==minlen)
        
            @property
            def most_common_words(self):
                most_common = self.wordfreq.most_common()
                howmany = most_common[0][1] if most_common else 0
                return sorted(w for w,c in most_common if c == howmany)
        
            @property
            def longest_words(self):
                maxlen = len(max(self.wordfreq, key=len))
                return sorted(w for w in self.wordfreq if len(w)==maxlen)
        
        def main():
            t = TextStats(textfreq)
            u = TextStats.from_file('corpus.txt')
            v = t + u
        
            print(t)
            print()
            print(u)
            print()
            print(v)
        
        if __name__=="__main__":
            main()
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2021-04-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-26
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多