数组每个元素的特殊操作

时间:2019-06-28 17:02:31

标签: python arrays python-3.x

我正在尝试以非常特定的格式写出数据,包括数字,日期,字符串。我的输入是一个包含此数据的数组,但不一定是正确的格式。因此,我需要在几乎每个元素上应用自定义操作。输入和输出的长度可变。

编辑:这里有更多说明: 我正在分析来自不同格式的不同来源的数据。任务是将它们写出相同的格式。我正在为每个源编写一个默认解析器。没有办法解决。我正在将数据写入一种格式,该格式包含输出的所有必需字段。例如[名称,数据,值,cur1,cur2,...] 现在,我需要以一种非常特定的方式格式化该数据。例如。在名称中添加一些内容。基本上,我需要根据索引以一种非常独特的方式修改数组中的每个元素。

输入内容可能类似于:

arr = ['name', 30.09.2019, 20.5, 'EUR', 'USD', ....]
# or
arr = ['name', 30.09.2019]
# or
arr = ['name', '', '', '', '', 'note', '17.5', '',....]

然后我需要对每个元素应用一些功能。 我唯一能想到的解决方案是:

for i in range(0, len(arr)):
   if(i == 0):
      process_zero(arr[i])
   elif(i == 1):
      process_one(arr[i])
   ...

如果长度不是可变的,我可以这样做:

process_zero(arr[0])
process_one(arr[1])
...

是否有更好/更清洁的方法?

2 个答案:

答案 0 :(得分:2)

由于数组是可变长度的,因此听起来好像不是将数据放入其中的适当结构。制作一个字典或一个类(对于Python> = 3.7,则为dataclass),它以更结构化的格式包含您的数据。

# With dictionaries
sample = {'name' : 'Jane', 'USD' : 3.50, ... }

def myfunc(data_dict):
    data_dict['name'] = data_dict['name'].upper()
    data_dict['USD'] += 1
    ...

myfunc(sample)

# With classes
class MyClass:
    def __init__(self, name = '', USD = 0, ...):
        self.name = name
        self.USD = USD
        ...

    def myfunc(self):
        self.name = self.name.upper()
        self.USD += 1
        ...

sample = MyClass('Jane', 3.5, ...)
sample.myfunc()

答案 1 :(得分:1)

由于要决定哪种行为完全取决于元素的索引,因此可以列出与数组中的元素相对应的函数列表。这有多复杂取决于行为的多样性以及每种数据类型的验证的重要性。查看您的最新示例,看来您至少需要检查空字符串。

然后,您可以简单地zip()使用函数列表并调用它们。您的功能列表将需要具有与您希望处理的最长数据中的元素一样多的功能。如果您使用排序器数据集进行压缩,则可以正常工作-较长的数据集将忽略多余的数据。

例如:

# Some function to handle particular types of data
def processNum(n):
    if n is None:
        print("no value")
        return
    try:
        n = float(n)
        n *= 3
        return f'Handle number: {n}'
    except ValueError:
        return "Bad input"

def currency(c):
    if isinstance(c, str) and c != '':
        return f'currency in: {c}'

# list of functions to apply (expecting at most 5 items to process)
processors = [
    lambda x: "Processed - 1: " + x,
    lambda x: "Processed - 2:" + x,
    processNum,
    currency,
    currency
]

然后您可以循环调用它们:

arr = ['name', '30.09.2019', 30.5, 'EUR', 'USD']
for f,a in zip(processors, arr):
    print(f(a))

或者,如果您想要一个新列表,请理解:

[f(a) for f,a in zip(processors, arr)]

结果

['Processed - 1: name',
 'Processed - 2:30.09.2019',
 'Handle number: 91.5',
 'currency in: EUR',
 'currency in: USD']

显然,详细信息取决于您处理每个项目的方式。