【问题标题】:Python: if string starts with a string from a listPython:如果字符串以列表中的字符串开头
【发布时间】:2012-01-08 16:14:35
【问题描述】:

我正在读取一个文件,每一行都有一个标签,后跟一个冒号,然后是我想要的信息。示例文件如下所示

Package: com.something.something
Section: Utilities
Name: Something

等,(如果您想知道,这是一个 apt 包索引)
所以我想遍历每一行,看看该行是否以列表中的元素开头。我在想类似的东西

PkgInfo={}
Tags=['Package', 'Section', 'Name']
for line in reader.readlines()
    if line.startswith(element in Tags):
        PkgInfo[element]=line.split(': ')[1]

此代码不起作用,但希望您能理解我想要做什么。我将如何实现这一目标?

【问题讨论】:

  • 不用道歉,大家都遇到过!只要纠正它,评论就会变得多余! ;-)

标签: python loops dictionary apt


【解决方案1】:

逻辑略有不同的可行解决方案:

PkgInfo={}
Tags=['Package', 'Section', 'Name']


for line in reader.readlines():
    entry = line.strip().split(': ', 2)
    if len(entry) != 2:
        continue
    element, value = entry[0], entry[1]
    if element in Tags:
        PkgInfo[element] = value

print PkgInfo

请注意,对元素的迭代不仅仅是一个问题。 Tags 中的“包”被定义为“包:”、Tags 在循环中引用为tagssplit.line 而不是line.split(),值不会被剥离。

【讨论】:

  • 我发现这个解决方案特别优雅,可能是因为它最好地集成到我现有的代码中。 :D 但是这里还有很多其他好的答案!只是这个最适合我。 :)
【解决方案2】:

试试这个:

PkgInfo = {}
Tags = ['Package', 'Section', 'Name']

for line in reader.readlines():
    for element in Tags:
        if line.startswith(element):
            PkgInfo[element] = line.split(': ')[1]
            break

【讨论】:

    【解决方案3】:

    所有基于 split() 的解决方案的问题是,如果冒号出现多次,它们可能会中断。这不太优雅但更健壮:

    PkgInfo = {}
    Tags = ['Package','Section','Name']
    splitter = ': '
    splitLen = len(splitter)
    for line in reader.readlines():
      firstColon = line.find(splitter)
      if firstColon > 0: 
        key = line[:firstColon]
        if key in Tags:
          pkgInfo[key] = line[firstColon + splitLen:] 
    

    【讨论】:

      【解决方案4】:

      我建议您在: 处分行,然后测试第一部分是否是您的关键字之一。这可以通过使用setin 运算符轻松完成:

      tags = set(['Package', 'Section', 'Name'])
      pkgInfo = {k: v.strip() for k, v in (line.split(':') for line in reader) if k in tags}
      

      或更长的版本:

      tags = set(['Package', 'Section', 'Name'])
      pkgInfo = {}
      
      for line in reader:
          k, v = line.split(':')
          if k in tags:
              pkgInfo[k] = v.strip()
      

      但请注意,如果每一行中没有一个冒号,这将失败。

      【讨论】:

        【解决方案5】:

        你需要遍历标签:

        PkgInfo={}
        Tags=['Package: ', 'Section', 'Name']
        for line in reader.readlines():
            for tag in Tags:
                if line.startswith(tag):
                    PkgInfo[tag]=line.split(': ')[1]
                    break
        

        【讨论】:

        • 似乎不是他想要的。请注意,当一个字符串以给定集合中的多个字符串开头时。
        • 添加了break。但是,鉴于他的示例代码,这是不可能的。
        • 是的,伙计,这是真的。我只是指出这一点。现在看起来很好。 :P
        【解决方案6】:

        我会尝试这样的:

         PkgInfo={}
         #I assume it should be 'Package' not 'Package: '
         Tags=['Package', 'Section', 'Name']
        
         for line in reader.readlines()
            k, v = line.split(': ')
            if k in Tags:
                PkgInfo[k] = v
        

        甚至更快更脏的两个班轮:

         #I assume it should be 'Package' not 'Package: '
         Tags=['Package', 'Section', 'Name']
        
         PkgInfo = dict(line.split(': ') for line in reader.readlines() if line.split(': ')[0] in Tags)
        

        【讨论】:

          猜你喜欢
          • 2021-06-20
          • 2020-08-27
          • 2021-12-28
          • 1970-01-01
          • 2022-01-13
          • 1970-01-01
          • 1970-01-01
          • 2014-12-02
          • 1970-01-01
          相关资源
          最近更新 更多