微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

转换字典中的文本

如何解决转换字典中的文本

我有一个这样的文本文件,我正在将文本文件转换成字典。将其中一个值作为键,将其余值作为键内的值。

0.8,3.5,jerry,5.5,4,78
0.9,2,amy,6.2,1.0,alan,7.8,9,90

这就是我所拥有的,因为其中一个学生故意漏掉了一个成绩。

  openData = open("students.txt",'r')

  myDic = dict()

  for col in openData:
      line = col.strip().split(",")
      q1 = line[0]
      q2 = line[1]
      name = line[3]  
      mag = line[4]
      grade = line[6]
      myDic[name] = q1,q2,mag,grade

   print(myDic)

我的问题是当我尝试运行它时,输出一直说等级 = line[6] 超出范围。 有人可以帮忙吗?谢谢

解决方法

我认为如果你在 90 后加一个逗号应该可以正常工作。

1.0,4,alan,7.8,9,90,

问题是当你用逗号分隔时,最后一行只有 6 个项目。

,

在尝试使用 line 之前检查 line[6] 的长度

for col in openData:
    line = col.strip().split(",")
    q1 = line[0]
    q2 = line[1]
    name = line[3]  
    mag = line[4]
    if len(line) >= 5:
        grade = line[6]
    else:
        grade = ''
    myDic[name] = q1,q2,mag,grade
,

你也可以填充行尾:

include <iostream>
using namespace std;

struct DogProperty //provided by 3rd party libarary
{
    char pawShape;
    char tailShape;
};

struct BirdProperty //provided by 3rd party libarary
{
    char wingLength;
    char wingWidth;
};

void decodeDog(char *msg,DogProperty *p) //provided by 3rd party libarary
{
    p->pawShape = msg[2];
    p->tailShape = msg[3];
}

void decodeBird(char *msg,BirdProperty *p) //provided by 3rd party libarary
{
    p->wingLength = msg[2];
    p->wingWidth = msg[3];
}

class Animal
{
public:
    Animal(int type) : type(type) {}
    virtual ~Animal(){}
    int type;
};

class Dog : public Animal
{
public:
    Dog(DogProperty property) : Animal(0)
    {
        this->property = property;
    }

    DogProperty property;
};

class Bird : public Animal
{
public:
    Bird(BirdProperty property) : Animal(1)
    {
        this->property = property;
    }

    BirdProperty property;
};

Animal* readMessage(char *message)
{
    if (message[0] == '0')
    {
        DogProperty property;
        decodeDog(message,&property);
        return new Dog(property);
    }
    if (message[0] == '1')
    {
        BirdProperty property;
        decodeBird(message,&property);
        return new Bird(property);
    }
    // other animals
    return new Animal(-1);
}

void processDog(Dog *dog)
{
    cout<<"Dog Paw: ";
    cout<<dog->property.pawShape<<endl;
}

int main()
{
    char messageA[20] = "0-1030202da-0302s";
    char messageB[20] = "1-1032649sf-0239s";
    char messageC[20] = "2-1032298kd-0357s";

    Animal* myAnimal = readMessage(messageA);
    if (myAnimal->type == 0)
    {
        Dog *dog = dynamic_cast<Dog*>(myAnimal);
        processDog(dog);
    }
    return 0;
}

myDic = dict() for col in openData: line = (col + ','*6).strip().split(',') q1,name,grade = [line[i] for i in (0,1,2,3,6)] myDic[name] = q1,grade print(myDic) 部分添加了 6 个逗号,从而保证了 7 个可用字段,根据需要替换尽可能多的空格。

这可以补偿数据文件中一行末尾的缺失数据,但不能补偿中间的数据。为此,您可能需要清理源数据,大概在字段为空的地方添加逗号。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。