【问题标题】:How to append to list without inserting a list within a list?如何附加到列表而不在列表中插入列表?
【发布时间】:2021-03-01 16:35:51
【问题描述】:

我有一个以 origin:row_rate 作为键值对的字典。 df2 是一个熊猫数据框,当我遍历数据框时,如果它们的键已经在字典中,我想将 row_rate 附加到它们对应的原始键的值中。否则,我想为原点创建新键并保存当前的 row_rate 和与该原点键对应的所有其他 row_rate。

我试过了:

data = {'Cuba': 999}

def append_rating(country, data):
    if country in data:
        return data[country]

for row in df2.itertuples(index=True):
    index = row.Index
    origin = row._9
    row_rate = row.Rating
    values = [append_rating(origin, data)]
    print(origin, values)
    values.append(row_rate)
    data[origin] = values
print(data)

这会返回: Congo [[[[[[[[[[None, 3.75], 3.5], 3.5], 3.5], 3.75], 3.0], 2.75], 3.25], 3.25]]

还有这个……

def append_rating(country, data):
    if country in data:
        return data[country]
    else:
        return []

返回这个: Congo [[[[[[[[[[[], 3.75], 3.5], 3.5], 3.5], 3.75], 3.0], 2.75], 3.25], 3.25]]

我想要的是列表的所有元素,只驻留在一个列表中。像这样的东西: Congo [3.75, 3.5, 3.5, 3.5, 3.75, 3.0, 2.75, 3.25, 3.25]

对不起,基本问题。谢谢你的帮助:)

【问题讨论】:

    标签: python pandas list append


    【解决方案1】:

    我相信您正在寻找list.extend(other_list) 方法。

    https://docs.python.org/3/tutorial/datastructures.html

    a = [1, 2, 3]
    b = [4, 5, 6]
    
    a.extend(b)
    
    a == [1, 2, 3, 4, 5, 6]
    

    【讨论】:

      【解决方案2】:

      您可以简单地使用list.extend()

      【讨论】:

        【解决方案3】:

        前言

        首先:您希望data 包含列表,因此最好将data['Cuba'] 初始化为单例列表[999] 而不是int 999

        第二:你将有如下逻辑:

        如果origin 已经在data 中,则追加到data[origin];否则, 创建一个新条目data[origin]

        当你有这种逻辑时,你可以使用defaultdict 而不是dictdefaultdictdict 的子类,它会在需要时自动创建不存在的条目,并使用默认值对其进行初始化;在我们的例子中,默认值是一个空列表。

        使用defaultdict

        考虑到这两点,我们可以简化您的代码:

        from collections import defaultdict
        
        data = defaultdict(list, {'Cuba': [999]})
        
        for row in df2.itertuples(index=True):
            index = row.Index
            origin = row._9
            row_rate = row.Rating
            data[origin].append(row_rate)
        
        print(data)
        

        使用if/else

        如果我们没有使用defaultdict,代码会类似但稍微复杂一点:

        data = {'Cuba': [999]}
        
        for row in df2.itertuples(index=True):
            index = row.Index
            origin = row._9
            row_rate = row.Rating
            if origin in data:
                data[origin].append(row_rate)
            else:
                data[origin] = [row_rate]
        
        print(data)
        

        dict.get 与默认参数一起使用

        或者,我们可以使用 dict.get 及其默认参数;这个dict方法和你的函数append_rating类似:

        data = {'Cuba': [999]}
        
        for row in df2.itertuples(index=True):
            index = row.Index
            origin = row._9
            row_rate = row.Rating
            data_origin = data.get(origin, [])
            data_origin.append(row_rate)
            data[origin] = data_origin
        
        print(data)
        

        请注意data.get(origin, [])append_rating(origin, data) 完全相同:

        data = {'Cuba': [999]}
        
        def append_rating(country, data):
            if country in data:
                return data[country]
            else:
                return []
        
        for row in df2.itertuples(index=True):
            index = row.Index
            origin = row._9
            row_rate = row.Rating
            data_origin = append_rating(origin, data)
            data_origin.append(row_rate)
            data[origin] = data_origin
        
        print(data)
        

        注意:我认为函数append_rating 的名称不合适。 “追加”通常意味着我们通过添加元素来积极修改某些东西。例如,在 python 中,l.append(x) 通过将元素x 添加到l 来修改列表l。但是,您的函数 append_rating(origin, data) 不会修改 data。相反,它会在 data 中查找一个条目,如果存在则返回它。这就是为什么最好将其称为get_ratingget_if_exists 或类似名称的原因。但实际上这个函数在python中已经存在,是dict.get

        有用的文档

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2020-07-26
          • 1970-01-01
          • 2021-12-15
          • 1970-01-01
          • 2021-04-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多