在“while”循环中展开列表

2024-09-27 04:26:46 发布

您现在位置:Python中文网/ 问答频道 /正文

我有这个数据集

  Name1 Name2   Score
    John    Chris   15.4
    John    Luke    11.0
    John    Martin  10.1
    John    Paul    8.7
    John    Patty   8.0
    Patty   Stephanie   21.6
    Patty   Mila    21.6
    Patty   Martin  19.7
    Patty   Chris   17.2
    Patty   Luke    15.9
    Meghan  Kate    5.0
    Meghan  Chris   4.2
    Meghan  William 4.1
    Meghan  John    3.2
    Meghan  Stephen 3.0

我确定了不同的值和差异:

next_name2 = df['Name2']                
name1 = df['Name1']  
distinct_name1 = set(name1)
diff = set(next_name2) - distinct_name1 

得到

   diff = {'Stephen', 'Martin', 'Chris', 'Stephanie', 'Paul', 'Luke', 'Mila', 'Kate', 'William'}

由于diff的长度大于0,因此我运行以下命令:

while len(diff) > 0:
    new_run= [fun(x) for x in diff] 
    next_name2.append(new_run)    
    name1.append(diff)        
    unique_source.update(diff)

但我得到了一个错误:

TypeError: string indices must be integers

函数fun具有以下结构:

name2_list, score_list = [],[]

def fun(df):
    
    for x in df['Name1']: 
        
        url = "https://www.website.com/siteinfo/"+ x
        soup = BeautifulSoup(requests.get(url).content, "html.parser")

       name_i = soup.select("#card_mini_audience .site>a")   
       score_i = soup.select("#card_mini_audience .overlap>.truncation") 

       name_i = [name_x.text.strip() for name_x in name_i]
       score_i = [float(score_x.text.strip()) for score_x in score_i]  
        for pair in zip(name_i, score_i):
            print(pair)
        name2_list.append(name_i)
        score_list.append(score_i)
        
    
    return name2_list, score_list.append

每次运行该函数时,我都会得到如下列表:

对于x = Stephen

('Julie', 31.9)
('Mike', 30.9)
('Catherine', 30.7)
('Molly', 29.0)

对于x = Martin

('John', 34)

对于x = Chris

('Luke', 12)
('Jane', 32)

等等,for x in diff。 当所有的name2都在列表中时,即len(diff)为0时,while循环应该结束

这个错误似乎是由for x in df['Name1']:引起的,我认为问题在于,每次我在while循环中运行函数时,我都会将值表示为列表。 那么比如说,

  Name1 Name2   Score
    John    Chris   15.4
    John    Luke    11.0
    John    Martin  10.1
    John    Paul    8.7
    John    Patty   8.0
    Patty   Stephanie   21.6
    Patty   Mila    21.6
    Patty   Martin  19.7
    Patty   Chris   17.2
    Patty   Luke    15.9
    Meghan  Kate    5.0
    Meghan  Chris   4.2
    Meghan  William 4.1
    Meghan  John    3.2
    Meghan  Stephen 3.0
    Stephen ['Julie','Mike','Catherine','Molly'] [31.9,30.9,30.7,29.0]
    Martin  ['John'] [34]
    Chris   ['Luke','Jane'] [12, 32]
    

所以它需要扩展(每次,直到我在Name1列中拥有所有的name2)

你知道我如何解决这个问题吗


Tags: nameinfordiffjohnlistchrismartin
1条回答
网友
1楼 · 发布于 2024-09-27 04:26:46

在这一行中,您使用来自diff的项调用函数,这显然是一组字符串:

new_run = [fun(x) for x in diff]

但是,看起来fun()希望它的参数是PandasDataFrame对象

为了解决此问题,需要使用正确的参数调用函数

如果没有更多的信息,就不可能告诉你怎么做。你是想这样定义fun()

def fun(df, x):
    ...

在这种情况下,您应该这样调用它(假设df在范围的其他地方定义):

new_run = [fun(df, x) for x in diff]

作为一般编程建议,我建议您在代码中添加注释和docstrings,以帮助您跟踪不同变量的含义及其类型。如果需要,您甚至可以向代码中添加type hints,并使用类似MyPy的工具来检查它们

相关问题 更多 >

    热门问题