python - TypeError : unhashable type: 'list' when adding a count variable, 没有工作吗?

标签 python json python-3.x

我正在尝试使用 JSON 作为数据结构,来存储来自 API 的值,最终目标是能够稍后调用此数据并将其用于平台的其他方面。当前的问题是,当我将计数变量添加到列表中时,我将其转换为字符串并转储到 json 文件,但出现错误,但是当我完全删除计数变量并转储列表时,它工作正常,直到我尝试解码它,我尝试使用列表,因为(在我看来)将数据附加到它更容易,因为它是一个微服务,但我确实知道字典效率更高,但我也无法让它们工作。

代码有效,除非我添加计数变量,例如 n = 0 |计数 = str(n + 1)。在下面的代码中,有一些变量,例如throttle api等,上面定义了静态值,可以在设置模块中进行更改,即throttleApi = 30(timer.sleep函数的秒),并且代币余额也全部定义。

def add_entry(count,balance_list, Token1_balances, Token2_balances, Token3_balances,localtime):

   # check if in seen set
   if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
       return balance_list

   # add to seen set
   seen.add(tuple([count,Token1_balances, Token2_balances, Token3_balances,localtime]))

   # append to results list
   balance_list.append({'count':count,Token1: Token1_balances, Token2: Token2_balances, Token3: Token3_balances,'time':localtime})

   return balance_list


def write_to_json(lst, fn):
    with open(fn, 'a', encoding='utf-8') as file:
        for item in lst:
            x = json.dumps(item, indent=4)
            file.write(x + '\n')


balance_list = []
seen = set()

if __name__ == '__main__':

  print('-'*40)   
  print(" Service Online and logging file has been established")
  print('-'*40)  

  n = 0 
  while True:
    time.sleep(throttleClient)
    localtime = time.asctime( time.localtime(time.time()) )
    minute = datetime.datetime.now().minute
    print('Local current time:',localtime,'CDT\n')
    if minute % throttleApi == 0:
     try:

        count = str(n + 1)
        balance_query   = p2p.getBalances()["result"]
        Token1_balances = str(balance_query[Token1])
        Token2_balances = str(balance_query[Token2])
        Token3_balances = str(balance_query[Token3])
        args1 = [count,Token1_balances, Token2_balances, Token3_balances,localtime]
        balance_list = add_entry(balance_list, *args1)  # add entry - SUCCESS  
        write_to_json(balance_list, 'balance.json') 
     except requests.exceptions.ConnectionError as e:
        print(ConnectionError)
        print('-'*20)
        print("Can't log balances due to connection error")
        pass
    else:
      pass           

我本来期望得到

{
    "count":"1",
    "BTC": "{'available': '0.00524973', 'freeze': '0'}",
    "ETH": "{'available': '0', 'freeze': '0'}",
    "1SG": "{'available': '15.57', 'freeze': '0'}",
    "time": "Sat Aug  3 16:08:04 2019"
}

等等,但我得到了 1) 上面的数据,没有计数 或 2)

  File "balance_logging.py", line 105, in <module>
    balance_list = add_entry(balance_list, *args1)  # add entry - SUCCESS
  File "balance_logging.py", line 56, in add_entry
    if (count,Token1_balances, Token2_balances, Token3_balances,localtime) in seen:
TypeError: unhashable type: 'list'

最佳答案

当你调用addEntry()时,你已经交换了balance_list和count。因此,您试图查看您的大元组是否在“已看到”集合中,您正在对其中包含列表的元组进行散列。但由于列表是可变的,并且不允许成为集合和字典键的一部分,因此您会收到所看到的错误。

关于python - TypeError : unhashable type: 'list' when adding a count variable, 没有工作吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57343405/

相关文章:

python - 不同线条的多个 HoverTools( Bokeh )

python - 如何比较两个数据帧并过滤发现差异的行和列

python - 根据日期和时间分割数据

python - 使用 python 和 xpath 选择多个值

python - 如何一次更新字典中的所有项目?

java - 需要 json 解析方面的帮助

python - 如何使用 python 3 下载网站?

ruby-on-rails - 应该如何链接 json 响应,以便 ActiveResource 可以从日期生成 DateTime 对象?

java - 如何发送和接收包含带有 Jersey 的 JSON 的 PUT 请求?

python - 从类定义中的列表理解访问类变量