使用 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 循环将键和值添加到字典的主要内容,如果未能解决你的问题,请参考以下文章