开发者社区 问答 正文

类型错误:字符串索引必须是整数—Python中的列表和字典[关闭]

我有一个名为df_following的列表,它看起来像这样:

[('henrysimanjun13',                          following
  henrysimanjun13  [AndiDar59797467]), ('hamdalah47', Empty DataFrame
  Columns: []
  Index: []), ('vivoslot',                                         following
  vivoslot  [AprillParis, liputan6dotcom, detikcom]), ('KacangTopless',
                                            following
  KacangTopless  [mohmahfudmd, CallMeNayr, siti_dama]), ('infosantuy1',
                                                       following
  infosantuy1  [OneLouderApps, DakwahJateng, setkabgoid, okez...)]

print ("df_following[0]: ", df_following[0][0])
--> df following[0]: buin83
print ("df_following[0]: ", df_following[0][1]['following'][0][0]) 
--> df following[0]: AkuDutaDamai

从上面的列表中,我想做出这样的东西:

{buin83, AkuDutaDamai},{buin83, FarlinaYaz}, {buin83, Mom_isback}, {buin83, yosiago}, {killjoyyadi, susipudjiastuti}, {killjoyyadi, PetrusBun},..

我试着:

d = {}

for l in df_following:
    username = l[0][0]
    following = l[0][1]['following'][0][0]

    if username in d: 
        d[username][following] = [following]
    else: 
        d[username] = {username,following}

但我得到以下错误:

---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-135-437589d2001c> in <module>
      3 for l in df_following:
      4     username = l[0][0]
----> 5     following = l[0][1]['following'][0][0]
      6 
      7     if username in d:

TypeError: string indices must be integers

我不知道我的代码出了什么问题。任何建议吗? 问题来源StackOverflow 地址:/questions/59386757/typeerror-string-indices-must-be-integers-lists-and-dictionary-in-python

展开
收起
kun坤 2019-12-25 21:52:11 956 分享 版权
阿里云 AI 助理回答

你的代码中遇到的TypeError: string indices must be integers错误,是因为在某些情况下,你尝试以索引方式访问字符串(即使用[]),而实际上应该访问的是字典或列表结构。根据你的数据结构描述,问题可能出在某些列表项没有预期的嵌套结构,导致在尝试访问l[0][1]['following'][0][0]时出现问题。

为了处理这种情况并避免错误,你可以增加一些检查来确保在进行索引操作之前,数据是正确的类型和结构。下面是一个修改后的版本,它包含了对数据结构的检查:

d = {}

for l in df_following:
    # 确保列表项至少有两个元素
    if len(l) < 2:
        continue

    username = l[0]
    
    # 检查是否存在following信息且它是一个非空列表
    following_info = l[1]
    if isinstance(following_info, dict) and 'following' in following_info and isinstance(following_info['following'], list) and following_info['following']:
        following = following_info['following'][0]
        # 确保following也是一个可以索引的结构
        if isinstance(following, tuple) or isinstance(following, list):
            following = following[0] if following else None
        else:
            following = following
    else:
        # 如果没有有效的following信息,则跳过此循环
        continue

    # 使用set来避免重复,并保持集合的特性
    if username in d:
        if isinstance(d[username], set):
            d[username].add(following)
        else:  # 如果已经是字典或其他非集合类型,转换为集合
            d[username] = set(d[username])
            d[username].add(following)
    else:
        d[username] = {following}

# 如果需要,可以将集合转换回列表
d = {k: list(v) for k, v in d.items()}

这段代码首先增加了对每个列表项结构的检查,确保在访问之前它们符合预期的格式。如果某个用户的following信息不存在或者不符合预期的格式,该用户会被跳过,从而避免了错误。同时,使用集合(set)来存储跟随者,以自动去除重复项,并在最后根据需要将其转换回列表。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答