8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

尝试迭代列表时出现 IndexError

askiiart.net 3月前

79 0

我刚刚完成了哈佛 CS50P 在线课程,我的第一个项目是尝试开发一个程序来计算多项式函数的 y 值。我知道我的代码可能很糟糕

我刚刚完成了在线哈佛 CS50P 课程,我的第一个项目是尝试开发一个程序来计算多项式函数的 y 值。我知道我的代码可能优化得很糟糕,而且有一个库已经可以完成我正在做的事情,但这不是我真正的重点。我正在尝试做一些无论如何都能奏效的事情。

import math

equation = input("Equation: ").strip().lower().replace(" ", "")
value = input("Value of x: ")

chars = []
exponents = []
mults = []
sums = []
subs = []
divs = []
sqrts = []

result = 0

for char in equation:
    if char == "x":
        char = char.replace("x", value)
        chars.append(char)
    else: 
        chars.append(char)

for op in range(len(chars)):
    if chars[op] == "^":
        exponents.append(1)
    elif chars[op] == "*":
        mults.append(op)
    elif chars[op] == "+":
        sums.append(op)
    elif chars[op] == "-":
        subs.append(op)
    elif chars[op] == "/":
        divs.append(op)
    elif chars[op] == "v":
        sqrts.append(op)
        
for exponent in range(len(exponents)):
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
    chars[exponents[exponent] - 1] = expResult
    chars.remove(chars[exponents[exponent]])
    chars.remove(chars[exponents[exponent]])
    exponents.remove(1)
    result += float(expResult)
    
for sqrt in range(len(sqrts)):
    sqrtResult = int(chars[sqrts[sqrt] - 1]) * math.sqrt(int(chars[sqrts[sqrt] + 1]))
    chars[sqrts[sqrt] - 1] = sqrtResult
    chars.remove(chars[sqrts[sqrt]])
    chars.remove(chars[sqrts[sqrt]])
    result += float(sqrtResult)

for mult in range(len(mults)):
    multResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
    chars[mults[mult] - 1] = multResult
    chars.remove(chars[mults[mult]])
    chars.remove(chars[mults[mult]])
    result += float(multResult)
    
for div in range(len(divs)):
    divResult = int(chars[mults[mult] - 1]) * int(chars[mults[mult] + 1])
    chars[divs[div] - 1] = divResult
    chars.remove(chars[divs[div]])
    chars.remove(chars[divs[div]])
    result += float(divResult)
    
print(result)
print(chars)
print(exponents)

我仍在开发它的第一步。但是,每当我输入一个包含多个操作的函数时,我都会得到 IndexError: list index out of range .

例如:

Equation: x^3^3
Value of x: 2
Traceback (most recent call last):
  File "/Users/vinisiqueira/graphingCalc/graphingCalc.py", line 38, in <module>
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
                          ~~~~~~~~~^^^^^^^^^^
IndexError: list index out of range

当我将 for 循环改为仅迭代一次时,我得到:

Equation: 2^3^2
Value of x: 2
8.0
[8, '^', '2']
[1]

所以这意味着,对于第一次操作,它是有效的,但是当再次执行完全相同的操作时,它会失败。

如果这段代码不清楚的话,我深感抱歉,但如果有任何帮助我将不胜感激。

谢谢

帖子版权声明 1、本帖标题:尝试迭代列表时出现 IndexError
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由askiiart.net在本站《list》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 所以我尝试向活动添加一个新对象并将其存储在本地存储中,代码如下所示 pushObjectWisata(selectedIndex, selectedObjectId) async { PengunjungModel dataObjectWi...

    所以我试图向活动添加一个新对象并将其存储在本地存储中,代码如下所示

     pushObjectWisata(selectedIndex, selectedObjectId) async {
    
        PengunjungModel dataObjectWisata = listObjectWisata
            .firstWhere((element) => element.id == selectedObjectId);
    
    
        listAktifitas[selectedIndex].dataAktifitas!.add(dataObjectWisata);
    
        await saveListAktifitas(listAktifitas);
      }
    

    但我收到此错误:

    [错误:flutter/runtime/dart_vm_initializer.cc(41)] 未处理的异常:将对象转换为可编码对象失败:“listActivities”实例

    listAktifitas 本身是一个具有多级对象的列表。模型如下所示

    class listActivities {
      String? namaAktifitas;
      int? statusAktifitas;
      int? countActivity;
      String? thumbnail;
      List<PengunjungModel>? dataAktifitas;
    
      listActivities({
        this.namaAktifitas,
        this.statusAktifitas,
        this.countActivity,
        this.thumbnail,
        this.dataAktifitas,
      });
    
      factory listActivities.fromJson(Map<String, dynamic> json) => listActivities(
            namaAktifitas: json['namaAktifitas'].toString(),
            countActivity: json['countActivity'],
            statusAktifitas: json['statusAktifitas'],
            thumbnail: json['thumbnail'].toString(),
            dataAktifitas: List<PengunjungModel>.generate(
              json['dataAktifitas'].length,
              (index) => PengunjungModel.fromJson(
                  json['dataAktifitas'][index] ?? <String, dynamic>{}),
            ),
          );
    
      static List<listActivities> fromJsonList(dynamic jsonList) {
        final listAktifitas = <listActivities>[];
        if (jsonList == null) return listAktifitas;
    
        if (jsonList is List<dynamic>) {
          for (final json in jsonList) {
            listAktifitas.add(
              listActivities.fromJson(json),
            );
          }
        }
    
        return listAktifitas;
      }
    
      factory listActivities.fromRawJson(String str) =>
          listActivities.fromJson(jsonDecode(str));
    
      String toRawJson() => jsonEncode(toJson());
    
      Map<String, dynamic> toJson() {
        final data = <String, dynamic>{};
        data['namaAktifitas'] = namaAktifitas;
        data['statusAktifitas'] = statusAktifitas;
        data['countActivity'] = countActivity;
        data['thumbnail'] = thumbnail;
        data['dataAktifitas'] = dataAktifitas;
        return data;
      }
    }
    

    如您所见,它与另一个列表 pengungungModel List 有关系。模型如下所示:

    import 'dart:convert';
    
    import 'package:flutter/material.dart';
    import 'package:sbh_v2/model/pariwisata/foto.dart';
    import 'package:sbh_v2/model/pariwisata/kategori_pengunjung.dart';
    
    class PengunjungModel {
      String? title;
      int? id;
      String? harga_terendah;
      String? harga_tertinggi;
      String? deskripsi;
      String? jam_buka;
      String? jam_tutup;
      String? alamat;
      String? fasilitas;
      double? lat;
      double? lng;
      List<Foto>? list_foto = <Foto>[];
      KategoriPengunjung? kategoriPengunjung;
    
      PengunjungModel(
          {this.id,
          this.title,
          this.harga_terendah,
          this.harga_tertinggi,
          this.deskripsi,
          this.alamat,
          this.list_foto,
          this.jam_tutup,
          this.jam_buka,
          this.fasilitas,
          this.lat,
          this.lng,
          this.kategoriPengunjung});
    
      factory PengunjungModel.fromJson(Map<String, dynamic> json) =>
          PengunjungModel(
            id: json['id'],
            title: json['title'] ?? "-",
            alamat: json['alamat'] ?? "-",
            jam_buka: json['jam_buka'] ?? "-",
            jam_tutup: json['jam_tutup'] ?? "-",
            fasilitas: json['fasilitas'],
            lat: double.parse(json['lat'] ?? '0'),
            lng: double.parse(json['lng'] ?? '0'),
            harga_terendah: json['harga_terendah'] ?? "",
            harga_tertinggi: json['harga_tertinggi'] ?? "",
            deskripsi: json['deskripsi'] ?? "-",
            list_foto: List<Foto>.generate(
              json['foto'].length,
              (index) => Foto.formJson(
                json['foto'][index] ?? <String, dynamic>{},
              ),
            ),
            kategoriPengunjung: KategoriPengunjung.fromJson(
                json['kategori_layanan_pengunjung'] ?? <String, dynamic>{}),
          );
    
      factory PengunjungModel.fromRawJson(String str) =>
          PengunjungModel.fromJson(jsonDecode(str));
    }
    

    基本上,我尝试将具有特定 id 的 pengunjungModel 数据对象添加到具有特定索引的 listAktifitas 中...

    在 pushObjectWisata 中我尝试打印 selectedIndex 和 selectedObjectId 并且它工作正常。但是当我尝试打印 dataObjectWisata 时它返回该错误并且当我将 dataObjectWisata 添加到 listAktivitas 时也会发生同样的事情。

    我不知道我不明白什么。但也许这是因为这两个的模型。

    请帮帮我...谢谢

  • 您好,谢谢您的回答。这是对的。我认为问题出在 toJson 上,我尝试在每个模型中添加它,它确实有效。我发现在 dart 中使用这样的对象非常困难。您有什么建议吗,我可以在哪里了解它的行为以及我应该使用什么最佳实践?

  • 您在尝试对对象进行编码以进行存储时遇到错误,可能是在使用 JSON 编码时。错误消息“将对象转换为可编码对象失败”通常发生在您尝试序列化没有相应 JSON 表示的对象时。在您的代码片段中,您尝试将 listAktifitas 包含类型对象的 listActivities 到存储中。要解决此错误,您需要确保其中的所有对象 listAktifitas 都是可编码的。

    要修复此错误,您需要确保 PengunjungModel 还具有 toJson() 方法,以将其转换为可 JSON 编码的格式。以下是您可以修改 toJson() 中的方法 listActivities 以正确编码的 dataAktifitas .

    像这样 listActivities 更新你的 toJson()

    Map<String, dynamic> toJson() {
    final data = <String, dynamic>{};
      data['namaAktifitas'] = namaAktifitas;
      data['statusAktifitas'] = statusAktifitas;
      data['countActivity'] = countActivity;
      data['thumbnail'] = thumbnail;
      data['dataAktifitas'] = dataAktifitas != null
          ? dataAktifitas!.map((pengunjung) => pengunjung.toJson()).toList()
          : null; // Check if dataAktifitas is null to avoid runtime error
      return data;
    }
    

    确保 PengunjungModel toJson() 实施了适当的方法。

    Map<String, dynamic> toJson() {
     final Map<String, dynamic> data = new Map<String, dynamic>();
        data['id'] = this.id;
        data['title'] = this.title;
        data['harga_terendah'] = this.harga_terendah;
        data['harga_tertinggi'] = this.harga_tertinggi;
        data['deskripsi'] = this.deskripsi;
        data['jam_buka'] = this.jam_buka;
        data['jam_tutup'] = this.jam_tutup;
        data['alamat'] = this.alamat;
        data['fasilitas'] = this.fasilitas;
        data['lat'] = this.lat.toString();
        data['lng'] = this.lng.toString();
        if (this.list_foto != null) {
          data['foto'] = this.list_foto!.map((v) => v.toJson()).toList();
        }
        if (this.kategoriPengunjung != null) {
          data['kategori_layanan_pengunjung'] = this.kategoriPengunjung!.toJson();
        }
        return data;
      }
    

    修改该 pushObjectWisata 函数如下:

    Future<void> pushObjectWisata(int selectedIndex, String selectedObjectId) async{
    
      PengunjungModel? dataObjectWisata = listObjectWisata.firstWhereOrNull(
        (element) => element.id == selectedObjectId,
      );
    
      if (dataObjectWisata != null) {
        // Check if the dataAktifitas list is initialized
        if (listAktifitas[selectedIndex].dataAktifitas == null) {
          listAktifitas[selectedIndex].dataAktifitas = [];
        }
    
        // Add the dataObjectWisata to the dataAktifitas list
        listAktifitas[selectedIndex].dataAktifitas!.add(dataObjectWisata);
    
        // Convert listAktifitas to a JSON string
        String jsonListAktifitas = jsonEncode(
          listAktifitas.map((aktivitas) => aktivitas.toJson()).toList(),
        );
    
        // Save the JSON string to storage
        await saveListAktifitas(jsonListAktifitas);
      } else {
        print('PengunjungModel with id $selectedObjectId not found.');
      }
    }
    

    检查所有类的定义。确保其所有属性都是原始类型(如 String、int、double、bool)、列表或映射,或者 toJson() 如果它们是自定义类,则它们实现一个方法。确保您有一个名为 Foto 的类, toJson() 向其添加该方法。

  • 我不认为它为空,因为当我打印 dataObjectWisata 内部的字段时它会返回该值。例如 // print(dataObjectWisata.id.toString()) // 它返回 id 的值。但是当我打印 dataObjectWisata 本身时,它会返回那个转换的可编码对象。

  • 让我们来分析一下

    for exponent in range(len(exponents)):
    expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
    

    我想通过一些简单的替换让它更短

    我将用 i 来代替指数

    目前,我们可以将其制作成** int(chars [exponents [exponent] + 1])部分,因此我不会写它,因为它不会导致我们的错误。

       for i in range(len(exponents)):
          expResult = int(chars[exponents[i] - 1]) 
    

    \'列表索引超出范围\'表示指数[i]-1 的值很可能比 len(chars) 的值更大

    要测试这个请运行

    for exponent in range(len(exponents)):
        print(f" length of char list is  {len(chars)}" )
        print(f" current exponent value is   {exponents[exponent]} ")
        expResult = int(chars[exponents[exponent] - 1]) ** int(chars[exponents[exponent] + 1])
    

    当你的当前指数值超出字符列表的长度时,你就会明白为什么你的代码会失败

返回
作者最近主题: