一组上的Python迭代顺序

-1 python iteration set python-2.7

我正在解析两个大文件(Gb大小顺序),每个文件包含keys和对应values.一些keys在两个文件之间共享,但具有不同的对应values.对于每个文件,我想写一个新文件keys*和相应的文件values,keys*表示密钥同时出现在file1和file2中.我不关心key输出中的顺序,但绝对应该在两个文件中的顺序相同.

档案1:

key1
value1-1
key2
value1-2
key3
value1-3
Run Code Online (Sandbox Code Playgroud)

文件2:

key1
value2-1
key5
value2-5
key2
value2-2
Run Code Online (Sandbox Code Playgroud)

有效输出将是:

解析文件1:

key1
value1-1
key2
value1-2
Run Code Online (Sandbox Code Playgroud)

解析文件2:

key1
value2-1
key2
value2-2
Run Code Online (Sandbox Code Playgroud)

另一个有效的输出:

解析文件1:

key2
value1-2
key1
value1-1
Run Code Online (Sandbox Code Playgroud)

解析文件2:

key2
value2-2
key1
value2-1
Run Code Online (Sandbox Code Playgroud)

无效输出(在文件1和文件2不同的顺序键):

解析文件1:

key2
value1-2
key1
value1-1
Run Code Online (Sandbox Code Playgroud)

解析文件2:

key1
value2-1
key2
value2-2
Run Code Online (Sandbox Code Playgroud)

最后一个精度是,值大小远远大于密钥大小.

我想要做的是:

  • 对于每个输入文件,使用与文件中的键对应的键解析并返回a dict(让我们调用它file_index),以及与在输入文件中找到键的偏移量相对应的值.

  • 计算交集

    good_keys = file1_index.viewkeys() & file2_index.viewkeys()
    
    Run Code Online (Sandbox Code Playgroud)
  • 做一些像(伪代码):

    for each file:
        for good_key in good_keys:
            offset = file_index[good_key]
            go to offset in input_file
            get corresponding value
            write (key, value) to output file
    
    Run Code Online (Sandbox Code Playgroud)

迭代相同的集合是否保证我具有完全相同的顺序(假设它相同的集合:我不会在两次迭代之间修改它),或者我应该首先将集合转换为列表,并迭代清单?

Dan*_*man 6

Python的dicts和set是稳定的,也就是说,如果你在不改变它们的情况下迭代它们,它们肯定会给你相同的顺序.这是关于dicts文档:

键和值以任意顺序迭代,这是非随机的,在Python实现中各不相同,并且取决于字典的插入和删除历史.如果迭代键,值和项视图而没有对字典的干预修改,则项的顺序将直接对应.

  • Pedantry:您引用的文档段落仅保证此内容适用于字典。是否在任何地方都明确规定了相同的保证? (2认同)