我的for循环有什么问题?蟒蛇

时间:2016-01-28 13:07:50

标签: python list for-loop dictionary

这个for循环应该迭代我的输入中的'lines',因为它保存了我想要放在字典中作为键的用户名,并在该键中包含一个字典。我的输出包括我需要的信息,但也包括我不想要的奇数行。 我是python的新手,所以我还在努力理解语法。 这是我的代码:

def get_name(string_input):
    split_fullstop = string_input.split('.')
    list = [] #creates a list                               
    for line in split_fullstop: 
        count = 0   
        if count % 2 == 0: #if count is even            
            list.append(line.split('is connected to')) #add info to 'list'      
            count += 1 #increase count
        names = {name[0]:{} for name in list}
    return names

这是打印功能后的输出:

{'': {}, 'Levi ': {}, 'Bryant ': {}, 'Jennie likes to play Super Mushroom Man, Dinosaur Diner, Call of Arms': {}, 'Olive likes to play The Legend of Corgi, Starfleet Commander': {}, 'Debra likes to play Seven Schemers, Pirates in Java Island, Dwarves and Swords': {}, 'Levi likes to play The Legend of Corgi, Seven Schemers, City Comptroller: The Fiscal Dilemma': {}, 'Walter ': {}, 'Robin ': {}, 'John ': {}, 'Walter likes to play Seahorse Adventures, Ninja Hamsters, Super Mushroom Man': {}, 'Debra ': {}, 'Freda likes to play Starfleet Commander, Ninja Hamsters, Seahorse Adventures': {}, 'Mercedes likes to play The Legend of Corgi, Pirates in Java Island, Seahorse Adventures': {}, 'Ollie ': {}, 'Robin likes to play Call of Arms, Dwarves and Swords': {}, 'Bryant likes to play City Comptroller: The Fiscal Dilemma, Super Mushroom Man': {}, 'Freda ': {}, 'Olive ': {}, 'Mercedes ': {}, 'John likes to play The Movie: The Game, The Legend of Corgi, Dinosaur Diner': {}, 'Jennie ': {}, 'Ollie likes to play Call of Arms, Dwarves and Swords, The Movie: The Game': {}}

5 个答案:

答案 0 :(得分:3)

请记住,在for循环下面的同一缩进级别的所有代码都将在每次迭代时运行。因此,您要在for循环经历的每个项目中重新定义变量countnames。正如其中一条评论中所述,names应与return语句处于同一缩进级别。

在每次迭代时重新定义count意味着您将始终找到0 % 2 == 0。它应该在for循环之前定义。此外,只有在运行count部分时才会增加#if count is even。因此,假设在循环之前定义count,您会看到0为偶数,递增count并永远保留奇数值1

使用enumerate同时查看索引和值的循环。这样你只需要检查索引的偶数/奇数值。

答案 1 :(得分:0)

也许你的计数是一个错误缩进,count是设计来过滤偶数行。

for line in split_fullstop: 
    count = 0   
    if count % 2 == 0: #if count is even            
        list.append(line.split('is connected to')) #add info to 'list'      
    count += 1 #increase count

答案 2 :(得分:0)

因此,您使用了“for each循环”,它循环遍历可迭代和内置功能中的每个元素,仅评估偶数索引。而不是这个,我认为使用函数范围更清晰,更干净。

range(0, len(split_fullstop), 2)

仅评估偶数

答案 3 :(得分:0)

注意:请勿在{{1​​}}之类的变量中使用内置的'因为您将覆盖它们,并且可能导致将来出现意外行为。例如,使用list

您的l行将在每一步执行,因为它与names = {name[0]:{} for name in list}语句不在同一位置。对于if您要添加到count % 2 == 1空列表中的步骤。但是在您的解决方案中,您在每个步骤中重新定义dict,因此您将永远不会像@Isaac Drachman所提到的那样。因此,只需删除一些空格或制表符,然后在count循环前定义count

for

或者您可以使用def get_name(string_input): split_fullstop = string_input.split('.') l = [] #creates a list count = 0 for line in split_fullstop: if count % 2 == 0: #if count is even l.append(line.split('is connected to')) #add info to 'list' count += 1 #increase count names = {name[0]:{} for name in l} return names list comprehension重写它:

enumerate

答案 4 :(得分:0)

我只关注你的count变量,因为这是第一件告诉我错误的事情:

for line in split_fullstop: 
    count = 0   
    if count % 2 == 0: #if count is even            
        # some code
    count += 1 #increase count
    #some code
return names

首先,您在循环中使用count重置每个循环上的count = 0变量,因此每个循环count%2将等于0 。该行应该在循环之前(之前)。

其次,如果在条件count%2 == 0中,如果在一次迭代中count == 0,则增加变量,然后它将进入if-part,并将值增加到{{1 }}。
在下一个(和所有其他)迭代中,从count == 1开始,if部分的内部将不会被执行,因此count == 1变量不会改变。

所以,应该是这样的:

count