【问题标题】:TypeError: unhashable type: 'list' when adding a count variable, works without?TypeError: unhashable type: 'list' 添加计数变量时,没有?
【发布时间】:2019-08-04 02:43:13
【问题描述】:

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

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

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'

【问题讨论】:

  • 我也可能做错了,因为目标是能够加载这些数据并对其进行迭代,但是这些数据每天会创建几千条记录。
  • 您对add_entry 的调用可互换count 和balance_list。 (为什么那个函数会返回任何东西呢?)
  • 老实说,我是 python 新手,不完全确定为什么我在那里返回列表但它似乎有效,你将如何通过删除返回来处理它?我想我现在记得了,如果您在我调用 write_to_json(balance_list,'balance_list.json') 的代码中看到较低的位置,我试图避免重复条目,但我仍然得到重复项。
  • 我已经添加了更改并且它可以工作,除了计数它每次只将“1”记录到 json 文件中。
  • 集合不能包含列表。

标签: python json python-3.x


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2014-06-11
    • 2015-02-11
    • 2019-10-11
    • 2020-03-27
    • 2020-05-11
    • 1970-01-01
    • 2022-12-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多