【问题标题】:How to use a list of dictionaries as function arguments如何使用字典列表作为函数参数
【发布时间】:2018-08-10 10:28:43
【问题描述】:

我从这段代码开始:

import bs4, requests

def bal(address, symbol, name):
        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        return(elems)

print(bal('3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r', 'BTC', 'Bitcoin'))
print(bal('LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst', 'LTC', 'Litecoin'))

哪个有效并生成:

174,631.39464194
897,135.38526651

但是,该函数需要在大量字典中运行,因此我尝试修改代码并将数据放入字典中,然后列出要作为函数参数传递的字典。

import bs4, requests

wallet1 = {
    'address' : '3D2oetdNuZUqQHPJmcMDDHYoqkyNVsFk9r',
    'symbol' : 'BTC',
    'name' : 'Bitcoin',
    }

wallet2 = {
    'address' : 'LQL9pVH1LsMfKwt82Y2wGhNGkrjF8vwUst',
    'symbol' : 'LTC',
    'name' : 'Litecoin',
    }

wallets =  [wallet1, wallet2]

def bal(address, symbol, name):
        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        return(elems)

print(bal(wallets))

我收到以下错误消息:

Traceback (most recent call last):
  File "/Users/tfountain/Desktop/python_work/stack.py", line 46, in <module>
    print(bal(wallets))
TypeError: bal() missing 2 required positional arguments: 'symbol' and 'name'
>>> 

我到底哪里错了?

应该如何使用字典列表作为函数参数?

【问题讨论】:

  • 您当前将字典作为第一个参数address 传递。要么重写方法以获取单个字典,要么使用bal(**wallet) 将字典解包以分隔参数。
  • 您根本没有更改bal 的实现,您为什么期望它会起作用?
  • 试试bal(**wallet1)
  • @juanpa - python 新手不知道需要更改什么。这就是我使用stackoverflow的方式。
  • @But youe bal 函数只在每次调用时解析一个!如果你真的想检查每个钱包,你应该定义第二个函数 calll many_bal 这样的东西,然后做一个循环并在里面调用!

标签: python list dictionary arguments


【解决方案1】:

函数 'bal' 需要 3 个参数。

你用一个参数调用 bal,因此它抱怨它缺少 2 (3 - 1 = 2)。

你需要修改你的 bal 函数,使它只能接受一个参数,例如

def bal(wallets):

并从传递的参数中提取钱包字典,例如遍历它:

for w in wallets

所以现在您可以从w dict 访问'address, symbol, name',例如:

address = w['address']
symbol = w['sumbol']
name = w['name']

下面是适合你的代码:

def bal(wallets):
    elems_all = []
    for w in wallets:
        address = w['address']
        symbol = w['symbol']
        name = w['name']

        r = requests.get('https://bitinfocharts.com/' + name + '/address/' + address)
        soup = bs4.BeautifulSoup(r.text, 'html.parser')
        elems = soup.find('div', itemprop = 'offers').contents[0].text
        elems = elems.replace(symbol,'').strip()
        elems_all.append([elems, w])

    return elems_all

这是非常基本的实现,但它适合你。你可能想修改它以使用更漂亮的 Python 实现。

您可以通过访问 elems_all 元组列表来访问钱包的正确元素。

【讨论】:

  • 我看到了更新的代码,但我现在收到错误 - TypeError: append() 只需要一个参数(给定 2 个)
  • 抱歉,我会在添加编辑之前对其进行测试。 elems_all.append(elems, w) 改为列表 elems_all.append([elems, w]) 或元组 elems_all.append((elems, w))
  • 有什么简单的方法可以将余额附加到字典中吗?
  • 嘿,Tommy,我建议您在开始提问之前先了解 Python 基础知识和数据类型操作。只需搜索 Python 字典操作。字典是键值对的构建。将 k:v 对附加到 dict:dict1['k1']='v1'
【解决方案2】:

TL;DR

for w in wallets:
   print(bal(**w))

解决方案需要了解两个不同的概念,循环和参数解包

你不能打电话

bal(wallets)

因为它正在调用不存在的函数bal(&lt;list&gt;)...(您的函数有三个参数,而不是一个)。由于您的 bal 函数需要一个钱包,我们只需为您列表中的每个钱包调用一次。

你的函数仍然需要三个参数,所以我们不能只传递w,因为它是一个字典。您可以使用一些 Python 语法糖来自动将值从字典中提取出来,并将它们作为命名参数传递给函数。所以bal(**w) 将表现为bal(address=&lt;the value of address&gt;, symbol=&lt;val...&gt;, name=&lt;val...&gt;)

使用这种方法要记住的一点是,参数解包会将 dict 中的 ALL 键/值传递给函数,所以如果你添加了一些意想不到的东西,你会得到一个错误。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 2020-10-07
    • 1970-01-01
    • 2017-03-17
    • 2011-06-26
    • 2020-07-13
    相关资源
    最近更新 更多