目标
我想在list
中生成python
的序列,例如:
['s1a', 's1b', 's2a', 's2b', ..., 's10a', 's10b']
属性:
方法
为此,我使用xrange
和综合列表方法应用了以下代码:
# prefix
p = 's'
# suffix
s = ['a', 'b']
# numbers
n = [ i + 1 for i in list(xrange(10))]
# result
[ p + str(i) + j for i, j in zip(sorted(n * len(s)), s * len(n)) ]
问题
是否有更简单的语法来获取结果,例如使用itertools
?
与this问题类似?
答案 0 :(得分:5)
双重列表理解可以实现这一点:
['s'+str(x)+y for x in range(1,11) for y in 'ab']
答案 1 :(得分:3)
itertools.product
可能是你的朋友:
all_combos = ["".join(map(str, x)) for x in itertools.product(p, n, s)]
返回:
['s1a', 's1b', 's2a', 's2b', 's3a', 's3b', 's4a', 's4b', 's5a', 's5b', 's6a', 's6b', 's7a', 's7b', 's8a', 's8b', 's9a', 's9b', 's10a', 's10b']
编辑:作为一个单行:
all_combos = ["".join(map(str,x)) for x in itertools.product(['s'], range(1, 11), ['a', 'b'])]
编辑2:正如詹姆斯回答中指出的那样,我们可以将product
调用中列出的字符串元素更改为字符串,itertools
仍然可以迭代它们,选择字符来自每个人:
all_combos = ["".join(map(str,x)) for x in itertools.product('s', range(1, 11), 'ab')]
答案 2 :(得分:1)
怎么样:
<?php
declare(strict_types = 1);
require_once ('hhb_.inc.php');
$hc = new hhb_curl ();
$hc->_setComfortableOptions ();
$hc->exec ( 'https://www.bukalapak.com/user_sessions' );
$html = $hc->getResponseBody ();
$domd = @DOMDocument::loadHTML ( $html );
$inputs = array ();
foreach ( $domd->getElementById ( "new_user_session" )->getElementsByTagName ( "input" ) as $input ) {
$inputs [$input->getAttribute ( "name" )] = $input->getAttribute ( "value" );
}
var_dump ( $inputs );
assert ( array_key_exists ( 'authenticity_token', $inputs ) );
$inputs ['user_session[username]'] = 'Myuser@gmail.com';
$inputs ['user_session[password]'] = 'Blablabla';
$hc->setopt_array ( array (
CURLOPT_POST => true,
CURLOPT_POSTFIELDS => http_build_query ( $inputs ),
CURLOPT_URL => 'https://www.bukalapak.com/user_sessions',
CURLOPT_HTTPHEADER => array (
'Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
)
) );
$hc->exec ();
$html = $hc->getResponseBody ();
hhb_var_dump ( $hc->getStdErr (), $hc->getResponseBody () );
通过这种方式,您可以根据需要替换任意数量的后缀。
当然,每个后缀都可以随意。
答案 3 :(得分:0)
您可以使用双列表解析,在其中迭代数字和后缀。您不需要加载任何
下面是一个lambda函数,它接受3个参数,一个前缀,一些迭代次数和一个后缀列表
foo = lambda prefix,n,suffix: list(prefix+str(i)+s for s in suffix for i in range(n))
您可以像这样使用
foo('p',10,'abc')
或者像那样,如果你的后缀有多个字母
foo('p',10,('a','bc','de'))
答案 4 :(得分:0)
为了获得最大的多功能性,我会将其作为发电机。这样,您既可以创建列表,也可以根据需要生成序列项。
这是在Python 2或Python 3上运行的代码。
def psrange(prefix, suffix, high):
return ('%s%d%s' % (prefix, i, s) for i in range(1, 1 + high) for s in suffix)
res = list(psrange('s', ('a', 'b'), 10))
print(res)
for s in psrange('x', 'abc', 3):
print(s)
<强>输出强>
['s1a', 's1b', 's2a', 's2b', 's3a', 's3b', 's4a', 's4b', 's5a', 's5b', 's6a', 's6b', 's7a', 's7b', 's8a', 's8b', 's9a', 's9b', 's10a', 's10b']
x1a
x1b
x1c
x2a
x2b
x2c
x3a
x3b
x3c