python - 用于迭代具有不同数量元素的键的字典的单个函数
问题描述
首先,如果我的问题的术语有误,我提前道歉。对于我所说的字典的“单元素键”和“多元素键”,可能有一个更好的名称。(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 ,这样任何一个字典都不会失败。
解决方案
您可以使用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
推荐阅读
- android - 如何在 Android Studio 中使用 Places API 在地图上显示多个位置标记
- java - 如何使用 Android Studio 从 URL 加载图像?
- typescript - 在 React Native 中使用 TypeScript 的箭头函数返回组件
- css - 使用 Wordpress 的 Illdy 主题仅在 Jumbotron 中更改 TEXT 的背景颜色
- django - 如何在 Django 模板中建立索引
- sql - 如何使用 Oracle SQL Developer 选择当月的生日?
- amazon-ec2 - AWS powershell:获取-EC2InstanceType
- python - 我正在尝试使用 python boto3 列出 aws ECS 集群中的所有集群,它最多只能列出 100 个集群,我想要 300 个集群
- json - 如何在 pyspark 数据帧上应用 group by 并对结果对象进行转换
- multithreading - 如何使用 Tokio 限制同时执行的任务?