我有以下代码片段,我在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
答案 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)}
希望这有帮助!