【问题标题】:If statement in for loop in pythonpython中for循环中的if语句
【发布时间】:2018-03-04 15:12:06
【问题描述】:

我有一个字符串列表要遍历,每行包含'is connected to''likes to play' 作为标记,列表的每个项目中只有一个。所以我使用了一个for循环来迭代列表,里面是if语句来决定哪个短语在项目中。字符串列表是这样的:

lines = ['a is connected to b','a likes to play guitar, trampolines','b is connected to m,z', 'b likes to play piano','c is connected to s','c likes to play video games, ball games']

def create(string_input):
    network = {}
    lines = string_input.split('.')
    for line in lines:
        user = {}
        if len(line)>0:
            name = line[0:line.index(' ')]
            if 'is connected to' in line:
                friends = line[line.index('is connected to')+len('is connected to')+1:].split(",")
                user['friends']= friends
            elif 'likes to play' in line: 
                likes = line[line.index('likes to play')+ len('likes to play')+1:].split(",")
                user['likes']= likes
            network[name] = user
    return network
print create(lines)

但是,打印的结果并没有给我user['friends']user['likes'] 最终结果仅包含第二个 if 块中的数据,并且所有 if 'is connected to' 数据都被替换为 [] 并丢失。我不确定数据结构或 if 语句是否处理不正确。任何人都可以帮我看看这里有什么问题吗?提前致谢。

编辑

正如 David 所指出的,代码中的问题在于更新字典而不是 for 和 if 语句。谢谢大家!!

【问题讨论】:

  • 你实际上在哪里调用create函数?
  • 嗨,Evan,它叫做:print create(lines)
  • 上面粘贴的代码中没有任何地方。您应该添加所有相关的详细信息。
  • 已更正,谢谢!
  • 我不确定您是否正确使用了 split() 函数。这将采用一个字符串并将其拆分为一个数组,但是您传入的是行,这已经是一个数组。尝试删除lines = string_input.split('.'),因为您已经有一个格式化的数组。

标签: python for-loop if-statement


【解决方案1】:

试试这个:

lines = ['a is connected to b','a likes to play guitar, trampolines','b is connected to m,z', 'b likes to play piano','c is connected to s','c likes to play video games, ball games']

def create(string_input):
    network = {}
    lines = string_input.split('.')
    for line in lines:
        user = {}
        if len(line)>0:
            name = line[0:line.index(' ')]
            if 'is connected to' in line:
                friends = line[line.index('is connected to')+len('is connected to')+1:].split(",")
                user['friends']= friends
            elif 'likes to play' in line: 
                likes = line[line.index('likes to play')+ len('likes to play')+1:].split(",")
                user['likes']= likes
            network[name] = user
    return network

for line in lines:
    print(create(line))

您的代码很好,您只需逐项传递行列表中的字符串。还有其他方法可以做到这一点,但这是一种简单的方法。

希望对你有帮助!

编辑

我将迭代放在主函数中,因为当我提交原始答案时,我可以听到我的 CS 教授痛苦地尖叫。

def create(string_input):
    network = {}
    lines = string_input.split('.')
    for line in lines:
        user = {}
        if len(line)>0:
            name = line[0:line.index(' ')]
            if 'is connected to' in line:
                friends = line[line.index('is connected to')+len('is connected to')+1:].split(",")
                user['friends']= friends
            elif 'likes to play' in line: 
                likes = line[line.index('likes to play')+ len('likes to play')+1:].split(",")
                user['likes']= likes
            network[name] = user
    return network

def main():
    originalStrings = ['a is connected to b','a likes to play guitar, trampolines','b is connected to m,z', 'b likes to play piano','c is connected to s','c likes to play video games, ball games']
    for string in originalStrings:
        print(create(string))
main()

【讨论】:

  • 您好,谢谢您的回答。实际上,我需要正确的网络数据。 print 语句仅用于测试。
【解决方案2】:

network[name] = user 行是问题所在。看输入线'a 连接到 b','a 喜欢弹吉他,蹦床'。处理第一行时,清空user 变量并将连接写入它,然后将network[name] 设置为等于user。然后在处理第二行时,再次清空user 变量并将喜欢的值写入其中,然后将network[name] 设置为等于(新的)user,破坏之前存在于network[name] 中的任何内容。因此,您只需要保留每个用户的最后一行。

要解决此问题,请将network[name] = user 替换为:

if name in network:
    network[name].update(user)
else:
    network[name] = user

【讨论】:

  • 嗨,大卫,非常感谢您指出这一点。确实是这个原因!
【解决方案3】:

你每次在循环中替换dict用户,而dict会丢失之前的信息。试试这个:

def create(string_input):
    network = {}
    lines = string_input.split('.')
    for line in lines:
        if len(line)>0:
            name = line[0:line.index(' ')]
            if name not in network:
                network[name] = {}
            if 'is connected to' in line:
                friends = line[line.index('is connected to')+len('is connected to')+1:].split(",")
                network[name]['friends']= friends
            elif 'likes to play' in line: 
                likes = line[line.index('likes to play')+ len('likes to play')+1:].split(",")
                network[name]['likes']= likes

    return network

【讨论】:

  • 谢谢易先生的回答!赞赏!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-16
  • 2019-06-09
  • 1970-01-01
相关资源
最近更新 更多