在列表中的元素之间添加元素

时间:2017-08-05 13:00:26

标签: python list

如果我有一个列表,例如

[1,2,3]

和函数f(),如何插入以使新列表如下:

[1, f(1), 2, f(2), 3, f(3)]? 

5 个答案:

答案 0 :(得分:4)

您可以使用:

[y for x in data for y in (x,f(x))]

data初始列表,f当然是您要应用的功能。

例如,如果fstr函数(将数字转换为其文本等价物),则会生成:

>>> data = [1,2,3]
>>> f = str
>>> [y for x in data for y in (x,f(x))]
[1, '1', 2, '2', 3, '3']

所以我们在这里得到[1, '1', 2, '2', 3, '3'],其中1是最初1,而'1'f(1)

基准:我将following test setup更改为:

import pandas as pd
from timeit import timeit
from itertools import chain

wvo = lambda d, f: [y for x in d for y in (x,f(x))]
max = lambda d, f: list(chain.from_iterable(zip(d, map(f, d))))
mrc = lambda d, f: sum([[x,f(x)] for x in d], [])
chi = lambda d,f: [j for k in map(lambda x: (x, f(x)), d) for j in k]
mar = lambda d,f: [ee for e in zip (d, map (f, d)) for ee in e]

results = pd.DataFrame(
    index=pd.Index([1, 3, 10, 30, 100, 300,
                    1000, 3000, 10000, 30000, 100000], name='N'),
    columns='wvo max mrc chi mar'.split(),
    dtype=float
)

for i in results.index:
    pd.concat([df] * i, ignore_index=True)
    d = list(range(i))
    f = str
    for j in results.columns:
        stmt = '{}(d,f)'.format(j)
        setp = 'from __main__ import d, f, {}'.format(j)
        results.set_value(i, j, timeit(stmt, setp, number=10))

这意味着我们可以使用pandas测试不同文件大小的不同答案。对于每个配置,我们使用timeit执行10次测试。

这将生成以下时间(以秒为单位):

             wvo       max          mrc       chi       mar
N                                                          
1       0.000016  0.000029     0.000018  0.000022  0.000020
3       0.000026  0.000029     0.000031  0.000034  0.000026
10      0.000057  0.000053     0.000061  0.000076  0.000062
30      0.000145  0.000122     0.000210  0.000200  0.000145
100     0.000440  0.000347     0.000899  0.000588  0.000407
300     0.001263  0.000637     0.004416  0.001721  0.000680
1000    0.002425  0.001897     0.040877  0.003796  0.002325
3000    0.009269  0.009798     0.289162  0.015486  0.008430
10000   0.037131  0.032563     3.823171  0.044008  0.030609
30000   0.078577  0.060828    53.803486  0.096703  0.066899
100000  0.255477  0.195669  1094.482380  0.289030  0.191143

或相对而言(最好是1.00):

         wvo   max      mrc   chi   mar Best
N                                           
1       1.00  1.78     1.11  1.36  1.19  wvo
3       1.03  1.15     1.23  1.32  1.00  mar
10      1.08  1.00     1.17  1.45  1.18  max
30      1.19  1.00     1.73  1.65  1.20  max
100     1.27  1.00     2.59  1.69  1.17  max
300     1.98  1.00     6.93  2.70  1.07  max
1000    1.28  1.00    21.55  2.00  1.23  max
3000    1.10  1.16    34.30  1.84  1.00  mar
10000   1.21  1.06   124.90  1.44  1.00  mar
30000   1.29  1.00   884.52  1.59  1.10  max
100000  1.34  1.02  5725.98  1.51  1.00  mar

答案 1 :(得分:4)

In [18]: lst = [1,2,3]

In [19]: def f(x):
    ...:     return x**2
    ...:

In [20]: from itertools import chain

In [21]: list(chain.from_iterable(zip(lst, map(f, lst))))
Out[21]: [1, 1, 2, 4, 3, 9]

答案 2 :(得分:2)

与威廉的答案略有不同,避免了两个循环:

sum([[x,f(x)] for x in my_list], [])
  • [x, f(x)]创建一个包含当前元素和函数的两个元素的列表。

  • sum(..., [])使列表变得扁平。

答案 3 :(得分:1)

>>> data = [1, 2, 3]
>>> f = lambda x : x + 1
>>> [ee for e in zip (data, map (f, data)) for ee in e]
[1, 2, 2, 3, 3, 4]

答案 4 :(得分:1)

您可以使用maplist comprehension

f = lambda x: x**3
a = [1, 2, 3]
output = [j for k in map(lambda x: (x, f(x)), a) for j in k]
print(output)

输出:

[1, 1, 2, 8, 3, 27]