Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/302.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何修复Python中动态列表索引超出范围的问题_Python_Mysql - Fatal编程技术网

如何修复Python中动态列表索引超出范围的问题

如何修复Python中动态列表索引超出范围的问题,python,mysql,Python,Mysql,我们正在进行一个Python项目,我们正在更新两个列表,然后用另一个列表中的元素减去其中一个列表中的元素。两个列表的示例: list_station_temp = {25.0, 24.8, 24.9} list_lpn_temp = {25.2, 24.5, 24.8} 不幸的是,对于我们来说,列表使用Crontab每20分钟动态更新一次,这意味着有时2个列表的长度会有所不同,因此例如,列表的长度可能会有所不同: 有时len(list_lpn_temp)=3和len(list_station_

我们正在进行一个Python项目,我们正在更新两个列表,然后用另一个列表中的元素减去其中一个列表中的元素。两个列表的示例:

list_station_temp = {25.0, 24.8, 24.9}
list_lpn_temp = {25.2, 24.5, 24.8}
不幸的是,对于我们来说,列表使用Crontab每20分钟动态更新一次,这意味着有时2个列表的长度会有所不同,因此例如,列表的长度可能会有所不同:

有时
len(list_lpn_temp)=3和len(list_station_temp)=2
当我们试图相互减去列表时,我们会收到一个超出范围的索引

list_lpn_temp = []
list_station_temp = []
new_list_lpn_temp = []
list_lpn_WL = []
list_lpn_validated = []

for x in 3:
    a_temp = pd.read_sql('SELECT temperature FROM Raw_Data', conn).astype(float).values
    c_temp = pd.read_sql('SELECT temperature1m FROM Weather_Station', conn).astype(float).values

    list_lpn_temp.extend(a_temp)
    list_station_temp.extend(c_temp)

for i in range (len(list_lpn_temp)):
    WeLP = list_station_temp[i]-list_lpn_temp[i] #THIS IS WHERE THE INDEX OUT OF RANGE OCCURS
    if min_tol < WeLP < max_tol:
        validated_lpn = 1
        list_lpn_validated.append(validated_lpn)
        new_list_lpn_temp.extend(list_lpn_temp[i])
        list_lpn_WL.extend(WeLP)
    else:
        validated_lpn = 0
        list_lpn_WL.extend(WeLP)
        list_lpn_validated.append(validated_lpn)
        new_list_lpn_temp.extend(None)
代码的上面一行是索引超出范围的地方

更新代码

list_lpn_temp = []
list_station_temp = []
new_list_lpn_temp = []
list_lpn_WL = []
list_lpn_validated = []

dict_temperature = {}

for x in 3:
    a_temp = pd.read_sql('SELECT temperature FROM Raw_Data', conn).astype(float).values
    c_temp = pd.read_sql('SELECT temperature1m FROM Weather_Station', conn).astype(float).values

    if a_temp:
        list_lpn_temp.extend(a_temp)
    else: 
        list_lpn_temp.append(float('nan'))

    if c_temp:
        list_station_temp.extend(c_temp)
    else: 
        list_station_temp.append(float('nan'))

for temp in dict_temperature:
    WeLP.append(dict_temperature[temp]['station'] - dict_temperature[temp]['lpn'])
    print (f'WeLP = {WeLP}')
    if min_tol < WeLP < max_tol:
        validated_lpn = 1
        list_lpn_validated.append(validated_lpn)
        new_list_lpn_temp.extend(list_lpn_temp[i])
        list_lpn_WL.extend(WeLP)
    else:
        validated_lpn = 0
        list_lpn_WL.extend(WeLP)
        list_lpn_validated.append(validated_lpn)
list\u lpn\u temp=[]
列表\u站\u温度=[]
新列表\u lpn\u temp=[]
列表\u lpn\u WL=[]
列表\u lpn\u已验证=[]
dict_温度={}
对于3中的x:
a_temp=pd.read_sql('SELECT temperature FROM Raw_Data',conn.).astype(float).values
c_temp=pd.read_sql('从康涅狄格州的气象站选择温度1m)。aType(float)。值
如果出现以下情况:
列表lpn临时扩展(a临时)
其他:
列表\u lpn\u临时追加(浮点('nan'))
如果c_温度:
列表\u站\u温度扩展(c\u温度)
其他:
列表\站点\临时附加(浮点('nan'))
对于dict_温度中的温度:
附加说明(记录温度[temp]['station']-记录温度[temp]['lpn'])
打印(f'WeLP={WeLP}')
如果最小值<最大值<最大值:
已验证的\u lpn=1
list\u lpn\u validated.append(validated\u lpn)
新列表lpn临时扩展(列表lpn临时[i])
列表扩展(WeLP)
其他:
已验证的\u lpn=0
列表扩展(WeLP)
list\u lpn\u validated.append(validated\u lpn)
更新后接收错误:

  Traceback (most recent call last):
  File "compareTemp.py", line 129, in <module>
    print(f'DICT_TEMPERATURE_STATION = {dict_temperature[temp]["station"]}')
TypeError: list indices must be integers or slices, not str
回溯(最近一次呼叫最后一次):
文件“compareTemp.py”,第129行,在
打印(f'DICT_TEMPERATURE_STATION={DICT_TEMPERATURE[temp][“STATION”]})
TypeError:列表索引必须是整数或片,而不是str

您尝试过python中的set subtract操作吗?我认为您的用例可以满足这种方法

>>> list_a = [1,2,3,4]
>>> list_b = [3,4,5,6,7]
>>>
>>> set(list_a) - set(list_b)
set([1, 2])
>>>
输出是一个集合,可以使用
list
方法将其转换为列表

this_is_a_list = []
this_is_a_dict = {}
你有没有考虑过用一个dict来做同样的事情,而不是使用两个单独的列表

temperatures = {
    1: {
        'station': 25.0,
        'lpn': 25.2
    },
    2: {
        'station': 24.8,
        'lpn': 24.5
    },
    3: {
        'station': 24.9,
        'lpn': 24.8
    }
}

WeLP = []

for temp in temperatures:
    WeLP.append(temperatures[temp]['station'] - temperatures[temp]['lpn'])

print(WeLP)
输出为:

[-0.1999999999999993, 0.3000000000000007, 0.09999999999999787]

当添加到dict时,如果临时文件不存在,则将其添加为null,然后处理错误。我认为,如果我正确理解您的要求,您这样做的方式可能会错误地将一个结果从另一个结果中减去(例如,如果没有收集到值)。

您的意思是这样的吗?WeLP=set(list\u station\u temp[i])-set(list\u lpn\u temp[i])否,如下所示:set(list\u station\u temp)-(list\u lpn\u temp),废弃所有现有逻辑。这是假设您只希望所有元素都位于list_station_temp中,而不在list_lpn_temp中。我们不希望更改或重新配置任何一个列表,因为它们在以后的代码中是需要的,但我们希望将其保存在新列表中,这就是为什么我们保留了原来的两个列表。原始列表不会被修改,您将获得一个新列表。set(list_station_temp)-set(list_lpn_temp)结果为:“TypeError:unhabable type:'numpy.ndarray'”这可以解决问题。我们在实现字典后用代码更新了问题。不幸的是,我们收到了一个错误
[-0.1999999999999993, 0.3000000000000007, 0.09999999999999787]