【问题标题】:In Python, loop through a dict and set all values of list or dict to string在 Python 中,循环遍历一个 dict 并将 list 或 dict 的所有值设置为字符串
【发布时间】:2012-08-20 23:41:20
【问题描述】:

我有一个字典“元数据”,其中包含字符串、列表、字典和整数的键值对。如何循环遍历该字典并将所有非字符串或整数类型的值转换为字符串?

有没有办法同时删除值为空的键?如果不添加额外的循环,我怎么能做到这一点?

【问题讨论】:

  • 您问题的第二部分与您在an earlier question 上提出的问题相同。至于其余的,您尝试过什么?前面那个问题的答案应该可以让您对摆弄 dict 内容的一般任务有一个良好的开端。
  • 或者更一般地说,任何不是字符串或整数的类型都应该转换为字符串。
  • @BrenBarn:我不确定如何检测不是整数或字符串的类型。我也不确定这如何集成到上一个答案的单行中。现在我正在进行 2 次迭代(效率低下)并且正在寻找特定的数据类型(list + dict),但我宁愿找到一个更通用的解决方案,除了 int + string 之外的所有内容。
  • 听起来要了解的关键是isinstance 函数。
  • @Blckknght 谢谢,这就是我想要的。

标签: python list loops dictionary


【解决方案1】:

使用isinstance 检查值的类型。在 Python 3 中,您可以简单地编写:

{k:v if isinstance(v, (str, int)) else str(v) for k,v in dct.items() if k != ''}

在较旧的 Python 版本中,您必须注意没有字典推导式 (character 字符串,那么 2.5-2.7 等效项将是

dict((k, v if isinstance(v, (unicode, int, long)) else unicode(v))
     for k,v in dct.iteritems())

【讨论】:

  • 很好的解决方案 (+1) 但很好奇:为什么使用 isinstancetype
  • 因为isinstance 会匹配子类。例如,如果有人选择使用比 Python 内置字符串更快的字符串来实现OptimizedString(例如,因为他们总是知道应用程序中的编码,或者字符串连接到网络处理,或者与 TCL 共享等.),这仍然有效。 numpy's integer types 仍然有效 ints。检查type(v) in ... 会错过这些子类。
【解决方案2】:

这行得通:

d={'l':[1,2,3],'s':'abc','i':5,'f':1.23,'di':{1:'one',2:'two'},'emty':''}
{k:v if type(v) in (str,int, long,unicode) else repr(v) for k,v in d.items() if v!=''} 

打印:

{'i': 5, 's': 'abc', 'di': "{1: 'one', 2: 'two'}", 'l': '[1, 2, 3]', 'f': '1.23'}

【讨论】:

  • ?这会将所有内容转换为其repr,它不会单独留下ints,并在字符串中添加一个额外的引号(例如"abc" 变为"'abc'")。而if v 将删除任何 0 个整数。
猜你喜欢
  • 2019-07-28
  • 2013-06-02
  • 2015-11-14
  • 2021-12-15
  • 1970-01-01
  • 2019-04-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多