【问题标题】:Join dictionary item, keys [duplicate]加入字典项,键[重复]
【发布时间】:2014-07-22 17:32:12
【问题描述】:

join方法见下面代码sn-p(使用Python 2.7.2):

iDict={'1_key':'abcd','2_key':'ABCD','3_key':'bcde','4_key':'BCDE'}
'--'.join(iDict)

结果显示为

'2_key--1_key--4_key--3_key'

请评论为什么只加入键?顺序也不对。

注意 - 以下是个别方法。

  • '--'.join(iDict.values()) ==> 'ABCD--abcd--BCDE--bcde' ==> 顺序不对
  • '--'.join(iDict.keys()) ==> '2_key--1_key--4_key--3_key' ==> 顺序不对

【问题讨论】:

  • 请去掉每行代码末尾的分号。这是 Python!
  • only keys are joined 这就是它的作用。如果您还需要这些值,请使用items()the sequence is not in order 就是这样做的,dict 键没有排序。使用OrderedDictthat's what it does,我的意思是这是您在阅读文档时获得的信息。
  • 这个问题似乎跑题了,因为问题是why does it behave as documented rather than how I would like it to?

标签: python join


【解决方案1】:

Python 字典是无序的(或者更确切地说,它们的顺序是任意的),当您对它们进行迭代时,只会返回键:

>>> d = {'0':0, '1':1, '2':2, '3':3, '4':4}
>>> print(d)
{'4': 4, '1': 1, '0': 0, '3': 3, '2': 2}

如果您需要键和值,请使用iDict.items()

如果您需要订购,请使用collections.OrderedDict

【讨论】:

  • 从 3.8 开始(甚至更早一点),普通 dict 和有序 dict 之间的差异很小。
【解决方案2】:

如果您查看文档,您会了解到迭代 dict 会返回键。

你需要遍历dict.items(),它遍历元组(key, value)

'--'.join(iDict.items())

如果您需要将键和值连接到一个字符串中,则需要明确告诉 Python 如何执行此操作:

'--'.join('{} : {}'.format(key, value) for key, value in iDict.items())

【讨论】:

    【解决方案3】:

    对字典的迭代只会产生键:

    >>> list(iDict)
    ['2_key', '1_key', '4_key', '3_key']
    

    dict() documentation

    iter(d)
    返回字典键的迭代器。这是iterkeys() 的快捷方式。

    list()str.join() 都会在其参数上调用 iter() 以迭代元素。

    字典是无序的容器;它们的顺序源于底层数据结构,取决于键的插入和删除历史。

    这记录在dict.items():

    CPython 实现细节:键和值以非随机的任意顺序列出,因 Python 实现而异,并且取决于字典的插入和删除历史。

    另见Why is the order in dictionaries and sets arbitrary?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-11-21
      • 2013-09-14
      • 2012-10-22
      • 1970-01-01
      • 2018-07-02
      • 2014-04-13
      相关资源
      最近更新 更多