将数组定义为参数的函数

2024-05-14 00:44:28 发布

您现在位置:Python中文网/ 问答频道 /正文

我在python中工作,试图能够放入一个返回字符串的数据集(例如(1、6、8)(例如“NO+F-NO+”)。我认为数组可能不是正确的对象。我希望能够插入大数据集(例如(1,1,6,1,…,8,8,6,1)以返回字符串

def protein(array):
    ligand = ''
    for i in range(array):
        if i == 1:
            ligand = ligand + 'NO+'
        if i == 6:
            ligand = ligand + 'F-'
        if i == 8:
            ligand = ligand + 'NO+'
    return ligand

以下是输入和错误代码:

protein(1, 6, 8)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-44-a33f3d5c265e> in <module>()
----> 1 protein(1, 6, 8)

TypeError: protein() takes 1 positional argument but 3 were given

对于单输入,我得到了错误的输出:

protein(1)
Out[45]: ''

protein(6)
Out[46]: 'NO+'

如果需要进一步澄清,请告诉我,谢谢


Tags: 数据对象no字符串inforifdef
3条回答

您可能希望def protein(*array):这允许您提供任意数量的参数。您还必须使用for i in array:而不是for i in range(array):

首先,需要*args作为参数,以接受任意数量的参数,如示例中所示

一旦你这么做了,你只需在args上迭代。如果不是完全惯用的话,其余的代码也可以

def protein(*args):
    ligand = ''
    for i in args:
        if i == 1:
            ligand = ligand + 'NO+'
        if i == 6:
            ligand = ligand + 'F-'
        if i == 8:
            ligand = ligand + 'NO+'
    return ligand

一个更好的解决方案是建立一个从整数到离子(?)的映射,然后映射和连接

def protein(*args):
    d = {1: 'NO+', 6: 'F-', 8: 'NO+'}
    return ''.join(d.get(i, '') for i in args)

为不存在的索引返回空字符串实际上与不附加到结果相同

如果你像protein(1, 6, 8)那样调用它,你不是在传递元组:你传递了三个参数。由于您使用一个参数array定义了protein,因此会出现错误

通过使用*args,您可以使用任意参数。但是这个函数仍然不是很优雅,也不是很有效:它需要O(n2来计算字符串

一种更具声明性和效率的方法可能是使用字典并执行查找,然后将这些查找结合在一起:

translate = {1: 'NO+', 6: 'F-', 8: 'NO+'}

def protein(*array):
    return ''.join(translate[x] for x in array)

如果要忽略传递的不在字典中的值(例如忽略protein(1,7,6,8)中的7),可以用.get(x, '')替换[x]

translate = {1: 'NO+', 6: 'F-', 8: 'NO+'}

def protein(*array):
    return ''.join(translate.get(x, '') for x in array)

相关问题 更多 >