使用 for loop .splitlines 循环将键和值添加到字典

Posted

技术标签:

【中文标题】使用 for loop .splitlines 循环将键和值添加到字典【英文标题】:Loop adding key and value to dictionary using for loop .splitlines 【发布时间】:2020-05-05 22:38:06 【问题描述】:

我试图读取一个字符串并将第一行作为键添加到字典中,将第二行作为值添加到文件末尾。 所以 1 到键,2 到值,1 到键,2 到值,1 到键,2 到值...... 直到文件结束。

我正在尝试从字符串中添加键和值。 当我编写 8 个循环时,它工作正常,但我只想使用一个循环。 这是有效的 8 循环示例。

tmp_dic = 

String = "First\nSecond\nThird\nFourth\nFifth\nSixth\nSeventh\nEight"


for x in String.splitlines()[0:1:]:
    print(x)
    x2 = x
    tmp_dic[f"x"] = f""
    for y in String.splitlines()[1:2:]:
        print(y)
        tmp_dic[f"x2"] = f"y"

for x in String.splitlines()[2:3:]:
    print(x)
    x2 = x
    tmp_dic[f"x"] = f""
    for y in String.splitlines()[3:4:]:
        print(y)
        tmp_dic[f"x2"] = f"y"

for x in String.splitlines()[4:5:]:
    print(x)
    x2 = x
    tmp_dic[f"x"] = f""
    for y in String.splitlines()[5:6:]:
        print(y)
        tmp_dic[f"x2"] = f"y"

for x in String.splitlines()[6:7:]:
    print(x)
    x2 = x
    tmp_dic[f"x"] = f""
    for y in String.splitlines()[7:8:]:
        print(y)
        tmp_dic[f"x2"] = f"y"

print(tmp_dic)

打印输出正确:

First
Second
Third
Fourth
Fifth
Sixth
Seventh
Eight

而且字典也很好。

'First': 'Second', 'Third': 'Fourth', 'Fifth': 'Sixth', 'Seventh': 'Eight'

这是一个循环示例

tmp_dic = 

String = "First\nSecond\nThird\nFourth\nFifth\nSixth\nSeventh\nEight"


c1 = 0
c2 = 1


for x in String.splitlines()[f"c1":f"c2":]:
    tmp_dic[f"x"] = f""
    c1 = c1 + 1
    c2 = c2 + 1
    for y in String.splitlines()[f"c1":f"c2":]:
        print(y)
        tmp_dic[f"x2"] = f"y"
        c1 = c1 + 1 
        c2 = c2 + 1
print(tmp_dic)

我收到以下错误。但是 c1 和 c2 都是整数。

  File "testdic3.py", line 12, in <module>
    for x in String.splitlines()[f"c1":f"c2":]:
TypeError: slice indices must be integers or None or have an __index__ method

我也试过了:

tmp_dic = 

String = "First\nSecond\nThird\nFourth\nFifth\nSixth\nSeventh\nEight"


lengh = len(String.splitlines())

c1 = 0
c2 = 1

for I in range(lengh):
    x = String.splitlines()[f"c1":f"c2":]:
    tmp_dic[f"x"] = f""
    c1 = c1 + 1
    c2 = c2 + 1
    for y in String.splitlines()[f"c1":f"c2":]:
        print(y)
        tmp_dic[f"x2"] = f"y"
        c1 = c1 + 1
        c2 = c2 + 1

print(tmp_dic)

【问题讨论】:

【参考方案1】:

您的代码措辞很奇怪。 您可能想在问题中添加一个解释高级动机的句子

假设我们分配lines = String.splitlines()

那么你想要的只是lines[c1:c2], 而不是lines[f"c1":f"c2":]

(可以使用lines[c1:c2:], 但是stepsize默认为1所以没有必要。 您可以在反转时指定它,例如lines[c2:c1:-1].)

但是 c1 和 c2 都是整数。

确实如此。但是一旦你把它们变成了字符串 (使用 f 字符串格式化程序) 那么您就不能再使用它们进行切片(或下标)了。

另外,pep-8 要求您将变量命名为 string 而不是 String。 我们将初始资本用于class 而不是这样的临时变量。

编辑

当你用谷歌搜索某事时, 你只是假设它已经存在, 然后你描述你想要的东西是什么样子的。 像魔术一样工作!

在编写程序时, 你可以做出类似的假设。 你说你想要(键,值)对。 好吧,很公平,让我们假装有 已经为他们提供了一个功能:

def populate_dictionary():
    d = 

    for k, v in get_pairs():
        d[k] = v

    return d

嗯,这很容易! 但是等等,现在我们必须回到困难的部分, 我们需要一个get_pairs() 定义。 好消息是,现在我们正在解决一个 smaller 子问题, 这要容易得多:

def get_pairs(input='First\nSecond\nThird\nFourth\nFifth\nSixth\nSeventh\nEight'):
    lines = input.splitlines()
    for i in range(len(lines) // 2):
        yield lines[2 * i], lines[2 * i + 1]

哒哒!现在我们完成了。 (当然,您可以使用像 c1 这样的临时变量 如果您不想使用花哨的2 * i 表达式。) 它产生这个输出:

'First': 'Second',
 'Third': 'Fourth',
 'Fifth': 'Sixth',
 'Seventh': 'Eight'

(可以将for 循环替换为d.update(get_pairs()), 或者更简单地分配d = dict(get_pairs()), 但看来您正在寻找for 语句的练习。)

【讨论】:

我添加了对我刚才尝试做的事情的解释。我刚刚在我的代码中修复了从字符串到内容的命名约定。

以上是关于使用 for loop .splitlines 循环将键和值添加到字典的主要内容,如果未能解决你的问题,请参考以下文章

JavaScript for语句

列表如何在 python 中使用 for 循环实际工作?

04 循环链表

循环结构的问题

for循环子命令中的bash变量扩展[重复]

Swift中的Loop for Loop总和