Python 如何使用字典列表作为函数参数

Python 如何使用字典列表作为函数参数,python,list,dictionary,arguments,Python,List,Dictionary,Arguments,我从以下代码开始: 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 =

我从以下代码开始:

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'
>>> 
我到底哪里出了问题


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

函数“bal”需要3个参数

您使用一个参数调用bal,因此它会抱怨缺少23-1=2

您需要修改bal函数,使其只能接受一个参数,例如

def bal(wallets):
并从传递的参数中提取钱包字典,例如通过迭代:

for w in wallets
因此,现在您可以通过w dict访问“地址、符号、名称”,例如:

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_所有元组列表来访问with wallet的正确元素

TL;博士

for w in wallets:
   print(bal(**w))
解决方案需要理解两个不同的概念,循环和参数解包

你不能打电话

bal(wallets)
因为这是在调用不存在的函数bal…您的函数有三个参数,而不是一个。由于您的bal功能需要一个钱包,我们只需为您列表中的每个钱包调用一次即可

您的函数仍然需要三个参数,因此我们不能只传递w,因为它是一个字典。您可以使用一点python语法糖自动从字典中提取值,并将它们作为命名参数传递给函数。因此bal**w的行为将与baladdress=,symbol=,name=


使用这种方法需要记住的一点是,参数解包将把dict中的所有key/vals传递给函数,因此,如果您添加了意外的内容,您将得到一个错误。

您当前将dictionary作为第一个参数address传递。重写方法以获取单个字典,或者使用bal**wallet将字典解包为单独的参数。您根本没有更改bal的实现,为什么您希望它能工作?请尝试bal**wallet1@juanpa-python新手不知道需要更改什么。这就是我在stackoverflow上的结论。@但是youe bal函数每次调用只解析一个!如果你真的想检查每一个钱包,你应该定义第二个函数calll many_bal类似的东西,然后在里面做一个循环和调用!我看到了更新后的代码,但我现在得到了错误-TypeError:append只接受一个参数2 givensory,我应该在添加编辑之前测试它。elems_all.appendelems,w改为list elems_all.append[elems,w]或tuple elems_all.appendelems,有什么简单的方法可以将余额附加到字典中吗?嘿,Tommy,我建议您在开始问进一步的问题之前先了解Python的基础知识和数据类型操作。只需搜索Python字典操作。字典是键:值对的构建。将k:v对附加到dict:dict1['k1']='v1'