在python中生成一个数字序列和交替字符串

时间:2017-02-03 11:44:23

标签: python list

目标

我想在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问题类似?

5 个答案:

答案 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