【问题标题】:Python putting non uniform lines into a dictionaryPython将非统一行放入字典
【发布时间】:2012-07-03 06:41:05
【问题描述】:

输入文件如下所示:

A 3.00 B 4.00 C 5.00 D 6.00
E 3.20 F 6.00 G 8.22
H 9.00 
I 9.23 J 89.2
K 32.344

我希望这些字符成为字典中的键 而浮点数是值。

这是迄今为止我遇到的非工作失败。

def main():
   #Input File
   reader = open('candidate.txt', 'r'

   my_dictionary = {}
   i=0
   for line in reader.readlines():
      variable = line.split(' ')[i]
      value = line.split(' ')[i+1]
      my_dictionary[variable]= value
      i+=2

      print my_dictionary

if __name__ == '__main__':
  main()

【问题讨论】:

  • 想一想你的代码。 i 每行增加 2,对吗?所以你从第 1 行得到第一对,从第 2 行得到第二对,依此类推,这显然不是你想要的,对吧?您需要两个嵌套的 for 循环,一个用于行,一个用于获取一行中的所有对(如果您想继续使用 for 循环 - 有更有效的选项,例如,请参阅 guettli 的答案)。
  • 基本上,您需要成对地迭代列表中的项目(键、值)。这是一个显示不同技术的广泛答案:stackoverflow.com/questions/4628290/pairs-from-single-list - 我喜欢接受答案中的pairwise 函数。
  • @user1497892 请接受答案。或者添加 cmets 为什么答案不能解决您的问题。

标签: python file dictionary readline


【解决方案1】:
s='''A 3.00 B 4.00 C 5.00 D 6.00
E 3.20 F 6.00 G 8.22
H 9.00 
I 9.23 J 89.2
K 32.344
'''

s=s.split()
d=dict(zip(s[::2], s[1::2]))
print d

在上下文中:

my_dict = dict()
for line in reader.readlines():
    pairs = line.split()
    for key, value in zip(pairs[::2],pairs[1::2]):
        my_dict[key] = value # strip() not needed

【讨论】:

  • 嘿!感谢您的回复,但是有没有办法在不通过添加引号修改输入文件的情况下做到这一点?输入文件正在给我。
  • 非常好,虽然如果我是 OP,我不会使用这个确切的代码。尽可能避免一次读取整个文件总是更好。不过,这段代码是一个很好的想法的非常简洁的演示。
  • @user1497892,这是一个multiline string literal。您不需要输入文件中的引号。此外,要使代码正常工作,您需要确切知道 readlinesreadlineread 在文件对象上返回什么。请参考文档。
【解决方案2】:

这是一个使用迭代器的解决方案,它对流进行操作(因此不依赖于首先读取整个输入):

from itertools import izip

def group(iterable, n):
    """Yield iterable's items n at a time"""
    args = [iter(iterable)]*n
    return izip(*args)


def dictize(stream):
    r = {}
    for line in stream:
        for k,v in group(line.split(), 2):
            r[k] = v
    return r


from StringIO import StringIO

testinput = """A 3.00 B 4.00 C 5.00 D 6.00
E 3.20 F 6.00 G 8.22
H 9.00 
I 9.23 J 89.2
K 32.344"""

teststream = StringIO(testinput)

print dictize(teststream)

如果您可以使用字典推导,则可以将 dictize 函数替换为单行:

print {k:v for line in teststream for k,v in group(line.split(),2)}

【讨论】:

    【解决方案3】:
    with open('candidate.txt', 'r') as reader:
        print dict(zip(*[iter(reader.read().split())]*2))
    

    With 将打开的文件流称为reader 我们将read 作为一个整体,然后将split 分割为空格。现在我们有一个单词列表,我们将其转换为 iterator 并将其放入列表中并将其乘以 2 以生成两个相同迭代器的列表。这些是zipped 成对作为dictionary 的输入。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-11-10
      • 2023-03-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-21
      • 2017-09-01
      相关资源
      最近更新 更多