首页 > 解决方案 > 用于迭代具有不同数量元素的键的字典的单个函数

问题描述

首先,如果我的问题的术语有误,我提前道歉。对于我所说的字典的“单元素键”和“多元素键”,可能有一个更好的名称。(python新手警告)

如果我的代码有一个带有单元素键的字典和另一个带有多元素键的字典,那么一个函数将如何遍历这两个字典?

示例 - 如何编写一个打印以下列表字典的函数:

d1 = { "a": [ 12, 435, 3453, 12, 22 ] , "b": [ 33, 44, 23, 2 ] , "c": [ 3, 43, 12, 4, 125, 3321 ] }

d2 = { ( "a" , 100 ) : [ 21, 345, 53, 21, 22 ] , ( "b" , 200 ): [ 3, 3344, 32, 289 ] , ( "c" , 100 ): [ 3, 234, 21, 1214, 12, 31 ] , ( "a" , 300 ): [ 321 ] }

这是使用函数 print_hash 打印 d2 时失败的示例代码:

#!/usr/bin/env python3

d1 = { "a": [ 12, 435, 3453, 12, 22 ] , "b": [ 33, 44, 23, 2 ] , "c": [ 3, 43, 12, 4, 125, 3321 ] } 
d2 = { ( "a" , 100 ) : [ 21, 345, 53, 21, 22 ] , ( "b" , 200 ): [ 3, 3344, 32, 289 ] , ( "c" , 100 ): [ 3, 234, 21, 1214, 12, 31 ] , ( "a" , 300 ): [ 321 ] } 

def print_hash( h , desc ):
   "display a hash's keys and each key's values"
   print( '----- start: ' + desc )
   for key , values in h.items():  # works for single-element key, fails for multiple-element key
      print( 'key: %s' % key )
      for v in values:
         print( '\t%s' % v ) 
   print( '----- end: ' + desc )

print( '----- start: d1' )
for key , values in d1.items():
   print( 'key: %s' % key ) # example of how to print a hash with a single-element key
   for v in values:
      print( '\t%s' % v ) 
print( '----- end: d1' )

print( '----- start: d2' )
for ( keya , keyb ) , values in d2.items():
   print( 'key: %s / %s' % ( keya , keyb ) )  # example of how to print a hash with a multiple-element key
   for v in values:
      print( '\t%s' % v ) 
print( '----- end: d2' )

print_hash( d1 , 'd1' ) # works

print_hash( d2 , 'd2' ) # fails with "print( 'key: %s' % key ) TypeError: not all arguments converted during string formatting"

print_hash 可以修改为打印 d2,但它不会打印 d1。我想知道如何重写 print_hash ,这样任何一个字典都不会失败。

标签: python

解决方案


您可以使用f-string来简化您的代码并实现您想要的;f-string 正确处理这两种情况(字符串或元组):

d1 = { "a": [ 12, 435, 3453, 12, 22 ] , "b": [ 33, 44, 23, 2 ] , "c": [ 3, 43, 12, 4, 125, 3321 ] } 
d2 = { ( "a" , 100 ) : [ 21, 345, 53, 21, 22 ] , ( "b" , 200 ): [ 3, 3344, 32, 289 ] , ( "c" , 100 ): [ 3, 234, 21, 1214, 12, 31 ] , ( "a" , 300 ): [ 321 ] } 

def print_hash(h, desc):
    print('---- start:', desc)
    for k, values in h.items():
        print(f"key: {k}")
        for v in values:
            print(f"\t{v}")
    print('---- end:', desc)

print_hash(d1, 'd1')
print_hash(d2, 'd2')

输出:

---- start: d1
key: a
        12
        435
        3453
        12
        22
key: b
        33
        44
        23
        2
key: c
        3
        43
        12
        4
        125
        3321
---- end: d1
---- start: d2
key: ('a', 100)
        21
        345
        53
        21
        22
key: ('b', 200)
        3
        3344
        32
        289
key: ('c', 100)
        3
        234
        21
        1214
        12
        31
key: ('a', 300)
        321
---- end: d2

推荐阅读