python list to' n'字符串数取决于列表的长度

时间:2018-01-28 08:59:08

标签: python list loops

在Python中考虑以下list

c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

我想在n中创建n = len(c)/6个字符串。因此,对于此示例,预期输出将为:

str1=1|2|3|4|5|6
str2=7|8|9|10|11|12
str3=13|14|15|16|17|18

我如何使用循环?请注意,c的长度始终是6的倍数。

6 个答案:

答案 0 :(得分:5)

使用comprehension生成sub-list块,然后解压缩到变量中:

c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
str1, str2, str3 = (c[i:i+6] for i in range(0, len(c), 6))

或者,如果您确实希望strings喜欢'1|2|3|4|5|6',那么您可以在str.join上使用sub-lists,但这需要先将所有内容转换为strings

str1, str2, str3 = ('|'.join(map(str, c[i:i+6])) for i in range(0, len(c), 6))

给出:

>>> str1
'1|2|3|4|5|6'
>>> str2
'7|8|9|10|11|12'
>>> str3
'13|14|15|16|17|18'

请注意,在第二个代码段中,您可以使用generator-expression代替map(),这通常被认为是更多Pythonic,但它们会为简单的事情占用更多字符(例如转换为{ {1}})。

答案 1 :(得分:1)

>>> c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> str1, str2, str3 = map('|'.join, zip(*[map(str, c)]*6))
>>> str1, str2, str3
('1|2|3|4|5|6', '7|8|9|10|11|12', '13|14|15|16|17|18')

在Python 2上使用from itertools import imap

如果你使用more_itertools库,你可以看起来更好:

>>> from more_itertools import grouper
>>> c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]
>>> str1, str2, str3 = map('|'.join, grouper(6, map(str, c)))
>>> str1, str2, str3
('1|2|3|4|5|6', '7|8|9|10|11|12', '13|14|15|16|17|18')

答案 2 :(得分:1)

您可以使用递归:

c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

multiple=len(c)/6

def hello(c1,g1):

    if not c1:
        return 0
    else:
        print(c1[:g1])
        return hello(c1[g1:],g1)
print(hello(c,int(len(c)/multiple)))

输出:

[1, 2, 3, 4, 5, 6]
[7, 8, 9, 10, 11, 12]
[13, 14, 15, 16, 17, 18]

答案 3 :(得分:0)

你也可以在这里使用join:

c=[1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

n = len(c)/3
for i in range(0,len(c),n):
    print "|".join(str(x) for x in c[i:i+n])

答案 4 :(得分:0)

使用strings = [] sl_sz = 6 for i in range(0, len(c) / sl_sz): strings.append("|".join(map(str, c[i*sl_sz:(i + 1)*sl_sz]))) 循环将类似于:

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Button addBuyInButton = (Button) findViewById(R.id.addBuyInButton);
        addBuyInButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                EditText feeNumEditText = findViewById(R.id.feeNumEditText);
                EditText buyInNumEditText = 
findViewById(R.id.buyInNumEditText);
                TextView targetTextView = findViewById(R.id.targetTextView);

答案 5 :(得分:0)

另一种方法是使用islice模块中的itertools

from itertools import islice

c = [1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18]

str1, str2, str3 = ["|".join(map(str, list(islice(c,i*6,i*6+6)))) for i in range(len(c)//6)]

print(str1)
print(str2)
print(str3)

输出:

1|2|3|4|5|6
7|8|9|10|11|12
13|14|15|16|17|18