我有两个列表,想对两个都应用相同的功能,我知道如何一次应用一个,但不能同时应用两个?然后我想添加每个元素以收集总数?
a = ['a','b','c','d','e']
b = ['b', np.nan,'c','e','a']
c = ['a','b','c','d','e']
我知道您可以在下面进行操作以获取输出,但是我想通过锯齿进行操作
a = [1 if 'a' in a else 99 for x in a]
b = [1 if 'a' in b else 99 for x in b]
c = [1 if 'a' in c else 99 for x in c]
我首先要在下面输出:
a = [1, 99, 99, 99, 99]
b = [99, 99, 99, 99, 1]
c = [99, 99, 99, 99, 1]
然后将每个元素添加到一个最终列表中
sum = [199, 297, 297, 297, 101]
答案 0 :(得分:0)
熊猫让这变得很容易 (尽管我确信使用numpy几乎一样容易)
import pandas
df = pandas.DataFrame({'a':a,'b':b,'c':c})
mask = df == 'a'
df[mask] = 1
df[~mask] = 99
df.sum(axis=1)
答案 1 :(得分:0)
我不确定我是否正确理解了您的问题。正如fgblomqvist所评论的那样,我在列表理解中将1 if 'a' in a
替换为1 if x == 'a'
。然后,我基本上使用了for循环重现了您的第二步,然后我使用zip
同步迭代所有列表的列表值以计算总和。
a = ['a','b','c','d','e']
b = ['b','a','c','e','a']
c = ['a','b','c','d','e']
# add the lists to a list.
lists = [a,b,c]
outcomes = []
for l in lists:
outcome = [1 if x == 'a' else 99 for x in l]
outcomes.append(outcome)
print(f'one of the outcomes: {outcome}')
results = []
# iterate over all list values synchronously and calculate the sum
for outs in zip(*outcomes):
results.append(sum(outs))
print(f'sum of {outs} is {sum(outs)}')
print(f'final result:{results}')
这是输出:
one of the outcomes: [1, 99, 99, 99, 99]
one of the outcomes: [99, 1, 99, 99, 1]
one of the outcomes: [1, 99, 99, 99, 99]
sum of (1, 99, 1) is 101
sum of (99, 1, 99) is 199
sum of (99, 99, 99) is 297
sum of (99, 99, 99) is 297
sum of (99, 1, 99) is 199
final result:[101, 199, 297, 297, 199]
编辑:为避免循环两次,您可以像这样将循环连接在一起:
lists = [a,b,c]
sums = []
for values in zip(*lists):
the_sum = 0
for val in values:
the_sum += 1 if val == 'a' else 99
sums.append(the_sum)
print(f'sums: {sums}')
请记住,您可以将1 if val == 'a' else 99
替换为some_func(val)
答案 2 :(得分:0)
import numpy as np
a = ['a','b','c','d','e']
b = ['b', np.nan,'c','e','a']
c = ['a','b','c','d','e']
dct = {"a":1}
sum_var = [np.nansum([dct.get(aa,99), dct.get(bb,99), dct.get(cc,99)]) for (aa, bb, cc) in zip(a,b,c)]
说明: 您可以使用列表理解(如您在示例中所做的那样)进行一些修改。而不是遍历单个列表,而是遍历所有列表的集合。您可以使用内置函数“ zip()”来实现此目的,该函数实际上将列表压缩在一起。
由于所有3个列表的长度相同,因此您可以遍历整个列表,并对每个元素应用其他转换,如示例中所示。 此示例中的附加功能是dictionary.get()方法,该方法为您获取每个键的值,此处为1表示“ a”。字典中没有的所有内容都将返回99。但是您可以使用自定义函数的相同方式。