Python3中枚举的奇怪行为

时间:2017-05-29 02:39:41

标签: python python-2.7 python-3.5

我有以下代码片段,我在python2.7.12和python3.5.2中运行

string partialInputName = "12345"; //textbox input value or whatever you want to input
        string[] directories = Directory.GetDirectories(@"C:\Code");
        FileInfo fileinDir;
        foreach(string dir in directories)
        {
            DirectoryInfo dirInfo = new DirectoryInfo(dir);
            if (dirInfo.Exists)
            {
                //taking the first (FirstOrDefault()), considering that all files have a unique name with respect to the input value that you are giving. so it should fetch only one file every time you query
                fileinDir = dirInfo.GetFiles("*" + partialInputName + "*.*").FirstOrDefault(); 
            }               
        }

在python2.7.12中运行时,我得到了预期的结果:

f = open(file_name,'r')
file_data= f.read()
f.close()
char_list = list(set(file_data))
c = {char:i for i,char in enumerate(char_list)}
x = {i:char for i,char in enumerate(char_list)}

在python3.5.2中,发生了一些奇怪的事情。我有时会得到如下结果:

    {'a': 0, ' ': 1, 'e': 2, 'i': 3, 'h': 4, '\n': 5, 'o': 6, 'r': 7, 'u': 8, 'w': 9, 'y': 10, '?': 11}
{0: 'a', 1: ' ', 2: 'e', 3: 'i', 4: 'h', 5: '\n', 6: 'o', 7: 'r', 8: 'u', 9: 'w', 10: 'y', 11: '?'}

另外,在python3.5.2中,但不是python2.7.12,每次运行程序时 {'h': 1, 'e': 4, 'r': 2, 'i': 3, '?': 0, '\n': 5, ' ': 6, 'u': 7, 'a': 8, 'y': 9, 'o': 10, 'w': 11} {0: '?', 1: 'h', 2: 'r', 3: 'i', 4: 'e', 5: '\n', 6: ' ', 7: 'u', 8: 'a', 9: 'y', 10: 'o', 11: 'w'} 的顺序都不同。对于python2.7.12,每次都是相同的顺序。

在两个版本的python char_list中都返回一个可迭代的对象。

为什么会发生这种奇怪的行为?

P.S。当我复制enumerate并将副本传递给第二个枚举而不是char_list

时,也会发生这种情况

2 个答案:

答案 0 :(得分:0)

枚举工作正常,但是当你将数据保存在字典中时,python不会保持顺序。默认情况下,Python字典是无序的,并且不保证按照添加它们的顺序保持键/值对。 OrderedDict是一个很好的Python解决方案,因为你可以阅读here。在CPython 3.6词典中也不会保持秩序,但未来不能保证。

如果您想保留订单,请考虑使用列表或元组。

答案 1 :(得分:0)

我能够复制您的问题,并通过进行以下更改获得预期的输出。

要进行两项更改。首先,编写char_list = list(set(file_data))将数据存储为一个集合,即unordered data type - 也就是说,它不会保留必要的存储顺序。因此,只需删除set文本即可解决订单问题。

对于结果中显示的新行文字,只需将.strip('\n')附加到file_data= f.read()行,它就会自动删除该文字。

进行更改并确认它们有效后,您的代码将如下所示:

f = open(file_name,'r')
file_data= f.read().strip('\n')
f.close()
char_list = list(file_data)
c = {char:i for i,char in enumerate(char_list)}
x = {i:char for i,char in enumerate(char_list)}

希望这有帮助!

相关问题