Python 按字母顺序打印dict项目

Python 按字母顺序打印dict项目,python,xml,xbmc,Python,Xml,Xbmc,我正在编写python脚本,以便在每次插入项目时都使用以下代码记录这些项目: channels = {} for elem in tv_elem.getchildren(): if elem.tag == 'channel': channels[elem.attrib['id']] = self.load_channel(elem) for channel_key in channels: channel = channels[chann

我正在编写python脚本,以便在每次插入项目时都使用以下代码记录这些项目:

channels = {}
for elem in tv_elem.getchildren():
    if elem.tag == 'channel':
       channels[elem.attrib['id']] = self.load_channel(elem)
       for channel_key in channels:
           channel = channels[channel_key]
           display_name = channel.get_display_name()
           print display_name
下面是它打印出来的内容:

20:58:02 T:6548  NOTICE: BBC One UK EN
20:58:02 T:6548  NOTICE: SVT 1 SE SE
20:58:02 T:6548  NOTICE: National Geographic Channel UK EN
20:58:02 T:6548  NOTICE: NRK1 NO NO
20:58:02 T:6548  NOTICE: Discovery Channel UK EN
20:58:02 T:6548  NOTICE: ARD DE DE
20:58:02 T:6548  NOTICE: DR1 DK DK
以下是XML文件:

<?xml version="1.0" encoding="UTF-8" ?>
<tv generator-info-name="www.timefor.tv/xmltv">
        <channel id="www.timefor.tv/tv/162">
            <display-name lang="de">ARD DE DE</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/1">
            <display-name lang="dk">DR1 DK DK</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/130">
            <display-name lang="no">NRK1 NO NO</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/135">
            <display-name lang="se">SVT 1 SE SE</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/10769">
            <display-name lang="en">BBC One UK EN</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/10214">
            <display-name lang="en">National Geographic Channel UK EN</display-name>
        </channel>
        <channel id="www.timefor.tv/tv/10847">
            <display-name lang="en">Discovery Channel UK EN</display-name>
        </channel></tv>

我希望以与XML文件相同的字母顺序打印它们,我打印的内容与XML文件的顺序不同。您知道如何使用我的代码以与XML文件相同的字母顺序打印项目吗?

根据您的解释:

#Additional import
from collections import OrderedDict
channels = OrderedDict()
for elem in tv_elem.getchildren():
    if elem.tag == 'channel':
       channels[elem.attrib['id']] = self.load_channel(elem)
       for channel_value in channels.items():
           print channel_value.get_display_name()
注意:这将提供与从XML中读取它们相同的顺序,而不是按字母顺序

编辑:由于您使用的是Python 2.6,因此有一个小的解决方法:

channels = []
for elem in tv_elem.getchildren():
    if elem.tag == 'channel':
       channels.append( (elem.attrib['id'], self.load_channel(elem)) )
       for channel_value in channels:
           print channel_value[1].get_display_name()

根据您的解释:

#Additional import
from collections import OrderedDict
channels = OrderedDict()
for elem in tv_elem.getchildren():
    if elem.tag == 'channel':
       channels[elem.attrib['id']] = self.load_channel(elem)
       for channel_value in channels.items():
           print channel_value.get_display_name()
注意:这将提供与从XML中读取它们相同的顺序,而不是按字母顺序

编辑:由于您使用的是Python 2.6,因此有一个小的解决方法:

channels = []
for elem in tv_elem.getchildren():
    if elem.tag == 'channel':
       channels.append( (elem.attrib['id'], self.load_channel(elem)) )
       for channel_value in channels:
           print channel_value[1].get_display_name()

更新:mogambo是在我打字时第一个进来的:

将第一行替换为

from collections import OrderedDict
channels = OrderedDict()

我只想补充一点:如果您不需要按id单独检索频道对象,只想按XML中显示的顺序对其进行迭代,那么您也可以将频道对象附加到列表中。

更新:我键入时,mogambo首先进入:

将第一行替换为

from collections import OrderedDict
channels = OrderedDict()

我只想补充一点:如果您不需要按id单独检索通道对象,只想按照XML中显示的顺序对它们进行迭代,那么您也可以将通道对象附加到列表中。

dict基本上是无序的。尝试使用一个xml文件,因为xml文件似乎不是按tv/xxxxx或显示名称按字母顺序排序的。这是故意的吗?@mogambo谢谢你的建议。你能用我应该使用的代码发布OrderedDict的源代码吗?你想要与XML相同的顺序,还是想按显示名称对通道进行排序?通道中的for通道应该在另一个for循环中吗?这没有任何意义。口述基本上是无序的。尝试使用一个xml文件,因为xml文件似乎不是按tv/xxxxx或显示名称按字母顺序排序的。这是故意的吗?@mogambo谢谢你的建议。你能用我应该使用的代码发布OrderedDict的源代码吗?你想要与XML相同的顺序,还是想按显示名称对通道进行排序?通道中的for通道应该在另一个for循环中吗?这没有任何意义。谢谢你,但我有个问题。集合导入OrderedICT导入错误:无法导入名称OrderedICT。我不知道我为什么会出错?我正在为xbmc使用Python2.6版本。不幸的是,OrderedDict是在Python2.7中引入的。我想您必须使用嵌套列表。OrderedDict是在Python2.7中添加到collections模块的。如果您使用的是Python 2.6:@IceArdor,请使用此配方。非常感谢您的帮助。它帮助我解决了这个问题。我得到了以完美字母顺序排列的项目列表作为XML文件。谢谢,但我有一个问题。集合导入OrderedICT导入错误:无法导入名称OrderedICT。我不知道我为什么会出错?我正在为xbmc使用Python2.6版本。不幸的是,OrderedDict是在Python2.7中引入的。我想您必须使用嵌套列表。OrderedDict是在Python2.7中添加到collections模块的。如果您使用的是Python 2.6:@IceArdor,请使用此配方。非常感谢您的帮助。它帮助我解决了这个问题。我得到了以完美字母顺序排列的项目列表,因为XML file.scav正确地指出,如果您不需要对字典中的单个项目进行固定时间查找,那么您最好使用列表,scav正确地指出,如果您不需要对字典中的单个项目进行固定时间查找,那么您还可以使用一个更节省内存的列表。