【问题标题】:How do I maintain the order when splitting a string?拆分字符串时如何保持顺序?
【发布时间】:2016-11-01 15:02:51
【问题描述】:

我正在尝试从拆分字符串创建有序字典。如何维护拆分字符串的顺序?抱歉,我最初的示例令人困惑,并且与有序字典的想法相矛盾。这是一个不同的问题,但我不确定如何拆分字符串。

我的示例文件“practice_split.txt”如下:

§1 text for chapter 1 §2 text for chapter 2 §3 text for chapter 3

我希望我的有序字典看起来像:

OrderedDict([('§1', 'text for chapter 1'), ('§2', 'text for chapter 2'), ('§3', 'text for chapter 3')])

代替:

OrderedDict([('1 text for chapter 1 ', '\xc2\xa7'), ('\xc2\xa7', '3 text for chapter 3'), ('2 text for chapter 2 ', '\xc2\xa7')])

这是我的代码:

# -*- coding: utf-8 -*    
import codecs
import collections
import re

with codecs.open('practice_split.txt', mode='r', encoding='utf-8') as document:
    o_dict = collections.OrderedDict()

    for line in document:
        conv = line.encode('utf-8')
        a = re.split('(§)', conv)
        a = a[1:len(a)]     

        for i in range(1, len(a) - 1):
            o_dict[a[i]] = a[i+1]
        print o_dict

谢谢!

【问题讨论】:

  • 为什么最后一个 dict 项与其他项不同?
  • 这完全不清楚,是一个 XY 问题。你真正想做什么?您的预期输出是不可能的,因为您一遍又一遍地映射相同的键并期望 dict 保存所有值。这不是 dicts 的工作方式。
  • 你永远无法得到你想要的结果OrderedDict([('\xc2\xa7', 'text for chapter 1'), ('\xc2\xa7', 'text for chapter 2'), ('\xc2\xa7', 'text for chapter 3')]),因为所有字典条目的键都是相同的,这是不可能的。
  • @MosesKoledoye 抱歉解决了这个问题,谢谢!
  • 除此之外,您的意思是一次遍历列表中的两个条目,而不是像多个答案中指出的那样一次遍历一个条目。

标签: python list ordereddictionary


【解决方案1】:

根据我对您的代码的理解,您的循环不正确。您需要第一个 § 和第一个文本条目。您还想跳过 § 元素作为字典的键,因此循环需要 2 步。最后,您可能希望去除文本开头/结尾的空格。

for i in range(1, len(a), 2):
    o_dict["{}{}".format(a[i - 1], i / 2 + 1)] = a[i].strip()
print o_dict 

for k, v in o_dict.iteritems():
    print k.decode('utf-8'), v

输出:

OrderedDict([('\xc2\xa71', 'text for chapter 1'), ('\xc2\xa72', 'text for chapter 2'), ('\xc2\xa73', 'text for chapter 3')])

§1 text for chapter 1
§2 text for chapter 2
§3 text for chapter 3

编辑:我更改了代码以反映对 OP 问题的编辑。

【讨论】:

  • 可能是正确的,但真的很奇怪。为什么我们要创建一个有序的字典,将每一章的文本映射到 § 符号?那是零意义。
  • @Two-BitAlchemist:也许 OP 想稍后拆分多个字符或其他什么。
  • 我现在只是在使用一个示例文本文件。最终脚本应该根据部分分割文本文件,这些部分将被标记为 §1、§2、§3 等。
  • 感谢您回答这两个问题!
  • @Shivani:请注意,如果您的部分编号超过 10,您将遇到排序问题。最好使用元组作为键,即。 o_dict[(a[i - 1], i / 2 + 1)] = a[i].strip()
【解决方案2】:

问题不在于 OrderedDict,而在于您的 for 循环。您的循环执行以下操作:

将第 1 章的文本按原样指向字典中的 '\xc2\xa7' #

points '\xc2\xa7' to ' text for chapter 2 ' # 这会被覆盖

将第 2 章的文本按原样指向字典中的 '\xc2\xa7' #

points '\xc2\xa7' to ' text for chapter 3 ' # 这会覆盖第二个条目,因此它会排在第二位

不确定你真正希望你的 dict 包含什么,或者我建议一些代码......

【讨论】:

  • 谢谢,它必须是 range(1, (end value), 2)。仍然不确定正确的最终值,但感谢您的提示。
猜你喜欢
  • 2021-01-19
  • 1970-01-01
  • 1970-01-01
  • 2021-07-19
  • 2013-08-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多