如何遍历我的2个列表以便我可以使用
a=[1,2,3,8,12]
b=[2,6,4,5,6]
获取
[1,6,2,5,3,8,6,12,2]
或使用
d=[a,b,c,d]
e=[w,x,y,z]
获取
[a,z,b,y,c,x,d,w]
(第1个列表中的第1个元素,第2个列表中的最后一个元素)
(第1列表中的第2个元素,第2列表中的第2个元素)
答案 0 :(得分:11)
[value for pair in zip(a, b[::-1]) for value in pair]
答案 1 :(得分:5)
您可以使用第二个列表的反面压缩第一个列表(使用itertools.izip_longest
),然后使用itertools.chain
加入列:
>>> d=['a','b','c','d']
>>> e=['w','x','y','z']
>>>
>>> from itertools import chain, zip_longest # in python 2 use izip_longest
>>>
>>> list(chain(*izip_longest(d, e[::-1])))
['a', 'z', 'b', 'y', 'c', 'x', 'd', 'w']
使用zip_longest()
的优点是它需要一个fillvalue
参数,当列表的长度不相等时,该参数将被填充以填充省略的项目。
如果您确定列表的长度相等,则最好使用内置函数zip()
。
>>> d=['a','b']
>>> e=['w','x','y','z']
>>> list(chain(*izip_longest(d, e[::-1], fillvalue='')))
['a', 'z', 'b', 'y', '', 'x', '', 'w']
@Jon Clements建议的更多pythonic方式:
list(chain.from_iterable(zip_longest(d, reversed(e))))
答案 2 :(得分:0)
好吧,我已经为python2做了一些测试:
public function getFiles() {
$folder = $_POST['folder'];
$userid = Auth::id();
$query = File::orderBy('created_at', 'desc')->where('userid', $userid)->where('folder', $folder)->get();
// foreach for many result returned by $query
foreach($query as $result){
$arr = array();
$arr['filename'] = $result->filename;
$arr['id'] = $result->fileid;
$arr['size'] = $result->conv_filesize;
echo json_encode($arr);
}
}
输出:
import time
from operator import itemgetter
from itertools import chain, izip_longest
a = [1, 2, 3, 8, 12]
b = [2, 6, 4, 5, 6]
print "Using value and zip"
starttime = time.time()
c = [value for pair in zip(a, b[::-1]) for value in pair]
elapsed = time.time() - starttime
print c
print elapsed
print "Using chain and izip"
starttime = time.time()
c = list(chain(*izip_longest(a, b[::-1])))
elapsed = time.time() - starttime
print c
print elapsed
print "Using itemgetter"
c = []
starttime = time.time()
for i in xrange(0, len(a)):
c.append(itemgetter(i)(a))
c.append(itemgetter(len(b)-i-1)(b))
elapsed = time.time() - starttime
print c
print elapsed
有时第一种方法更快,有时第三种方法。
这些是列表lenght = 1000的结果:
Using value and zip
[1, 6, 2, 5, 3, 4, 8, 6, 12, 2]
1.59740447998e-05
Using chain and izip
[1, 6, 2, 5, 3, 4, 8, 6, 12, 2]
3.2901763916e-05
Using itemgetter
[1, 6, 2, 5, 3, 4, 8, 6, 12, 2]
1.4066696167e-05
正如您可以看到第二种方法对于更长的列表更好。
答案 3 :(得分:0)
这个怎么样:
a=[1,2,3,8,12]
b=[2,6,4,5,6]
>>> a1 = list(map(lambda x: a1.extend([x,0]), a))
[None, None, None, None, None]
>>> a1
[1, 0, 2, 0, 3, 0, 8, 0, 12, 0]
>>> b1 = list(map(lambda x: b1.extend([0,x]), b[::-1]))
[None, None, None, None, None]
>>> b1
[0, 6, 0, 5, 0, 4, 0, 6, 0, 2]
>>> c = [x+y for x,y in zip(a1,b1)]
>>> c
[1, 6, 2, 5, 3, 4, 8, 6, 12, 2]
如果a和b的长度不同,则:
>>> c = [x+y for x,y in izip_longest(a1,b1)] #you choose your fillvalue.