python:两个成对列表的索引/分页

python:两个成对列表的索引/分页,python,Python,假设我有两个这样的列表,它们必须表示为对: cities = ['San Francisco', 'New York', 'Seattle', 'Portland', ] states = ['CA', 'NY', 'WA', 'OR'] 我有这样一个函数: def list(page): return "{0} -> {1} \n {2} -> {3} \n {4} -> {5} \n {6} -> {7}".format(keys[0], values[0]

假设我有两个这样的列表,它们必须表示为对:

cities = ['San Francisco', 'New York', 'Seattle', 'Portland', ]
states = ['CA', 'NY', 'WA', 'OR']
我有这样一个函数:

def list(page):
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5} \n {6} -> {7}".format(keys[0], values[0], keys[1], values[1], keys[2], values[2], keys[3], values[3])
def list(page):
    for page < 2:
        return first triplet
    for page < 3:
        return second triplet
    # etc.
def list(page):
    page -= 1
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5}".format(keys[0 + 3*page], values[0 + 3*page], keys[1 + 3*page], values[1 + 3*page], keys[2 + 3*page], values[2 + 3*page], keys[3 + 3*page], values[3 + 3*page])
我希望能够使用一个整数(这里,
page
)索引这些对,一次显示三个。假设我有十对城市和州,
1
它会显示前三个,
2
后三个,等等

假惺惺地说,我想它会是这样的:

def list(page):
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5} \n {6} -> {7}".format(keys[0], values[0], keys[1], values[1], keys[2], values[2], keys[3], values[3])
def list(page):
    for page < 2:
        return first triplet
    for page < 3:
        return second triplet
    # etc.
def list(page):
    page -= 1
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5}".format(keys[0 + 3*page], values[0 + 3*page], keys[1 + 3*page], values[1 + 3*page], keys[2 + 3*page], values[2 + 3*page], keys[3 + 3*page], values[3 + 3*page])
def列表(第页):
对于第<2页:
返回第一个三元组
第<3页:
返回第二个三元组
#等等。

但我认为可能有更好的方法,我想知道这可能是什么样子。

像这样的东西怎么样:

def list(page):
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5} \n {6} -> {7}".format(keys[0], values[0], keys[1], values[1], keys[2], values[2], keys[3], values[3])
def list(page):
    for page < 2:
        return first triplet
    for page < 3:
        return second triplet
    # etc.
def list(page):
    page -= 1
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5}".format(keys[0 + 3*page], values[0 + 3*page], keys[1 + 3*page], values[1 + 3*page], keys[2 + 3*page], values[2 + 3*page], keys[3 + 3*page], values[3 + 3*page])
不是最漂亮的代码,但如果调用
list(2)
它将打印出第二组三对代码。调用
列表(5)
将打印第5个等


请注意,此代码没有错误检查功能,因此如果调用第4页,但只有10个状态,则会出现索引错误。

类似这样的情况如何:

def list(page):
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5} \n {6} -> {7}".format(keys[0], values[0], keys[1], values[1], keys[2], values[2], keys[3], values[3])
def list(page):
    for page < 2:
        return first triplet
    for page < 3:
        return second triplet
    # etc.
def list(page):
    page -= 1
    return "{0} -> {1} \n {2} -> {3} \n {4} -> {5}".format(keys[0 + 3*page], values[0 + 3*page], keys[1 + 3*page], values[1 + 3*page], keys[2 + 3*page], values[2 + 3*page], keys[3 + 3*page], values[3 + 3*page])
不是最漂亮的代码,但如果调用
list(2)
它将打印出第二组三对代码。调用
列表(5)
将打印第5个等


请注意,此代码没有错误检查功能,因此如果调用第4页,但只有10个状态,则会出现索引错误。

您应该使用
islice
zip

from itertools import islice

def list_(page):
    return islice(zip(cities, states), (page - 1) * 3, page * 3)

注意,如果您使用的Python版本少于3,您将希望使用
izip
,可在
itertools
中找到

您应该使用
islice
zip

from itertools import islice

def list_(page):
    return islice(zip(cities, states), (page - 1) * 3, page * 3)
注意,如果您使用的Python版本少于3,您将希望使用
izip
,可在
itertools
中找到

设置:

cities = ['San Francisco', 'New York', 'Seattle', 'Portland', ]
states = ['CA', 'NY', 'WA', 'OR']
:

这将为您提供一个生成给定大小块的生成器。总而言之:

>>> for chunk in chunks(zip(cities, states)):
...     for piece in chunk:
...             print('{}, {}'.format(*piece))
...
San Francisco, CA
New York, NY
Seattle, WA
Portland, OR
您还可以将其转换为块的
列表,如下所示:

>>> places = [list(chunk) for chunk in chunks(zip(cities, states), 3)]
>>> places[0]
[('San Francisco', 'CA'), ('New York', 'NY'), ('Seattle', 'WA')]
并打印给定的块:

>>> print(*('{}, {}'.format(*place) for place in places[0]), sep='\n')
San Francisco, CA
New York, NY
Seattle, WA
设置:

:

这将为您提供一个生成给定大小块的生成器。总而言之:

>>> for chunk in chunks(zip(cities, states)):
...     for piece in chunk:
...             print('{}, {}'.format(*piece))
...
San Francisco, CA
New York, NY
Seattle, WA
Portland, OR
您还可以将其转换为块的
列表,如下所示:

>>> places = [list(chunk) for chunk in chunks(zip(cities, states), 3)]
>>> places[0]
[('San Francisco', 'CA'), ('New York', 'NY'), ('Seattle', 'WA')]
并打印给定的块:

>>> print(*('{}, {}'.format(*place) for place in places[0]), sep='\n')
San Francisco, CA
New York, NY
Seattle, WA
这不应该试图索引超过数组边界,并允许您返回包含1-2个条目的页面,而无需显式边界检查或异常处理。您可能希望确保数组的长度相等,否则会得到

None -> StateN
这不应该试图索引超过数组边界,并允许您返回包含1-2个条目的页面,而无需显式边界检查或异常处理。您可能希望确保数组的长度相等,否则会得到

None -> StateN

为什么用Flask标记这个?对不起,我还想展示一下我在Flask中使用这个代码做了什么,但是我忘了把Flask代码放进去。我将移除标签。为什么这是用Flask标记的?对不起,我还想展示一下我在Flask中使用此代码所做的操作,但我忘了将Flask代码放入。我将删除标记。你说得对,它不漂亮,但它也屏蔽了内置函数
list()
,我会提醒你不要这样做。@TigerhawkT3你的第二句话是什么意思?编辑:好的,我明白你的意思。我没有考虑它,因为这是OP使用的名称。公平地说,这也是我在示例中称为我的函数的名称。停止屏蔽内置项从来都不是一个坏时机。:)另外,像“
0
1
2
3
”这样的模式很好地表明您应该在那里的某个地方使用
范围
对象。您是对的,它不漂亮,但它也掩盖了内置函数
列表(),我警告你不要这样做。@TigerhawkT3你的第二句话是什么意思?编辑:好的,我明白你的意思。我没有考虑它,因为这是OP使用的名称。公平地说,这也是我在示例中称为我的函数的名称。停止屏蔽内置项从来都不是一个坏时机。:)此外,像“
0
1
2
3
”这样的模式很好地表明您应该在其中的某个地方使用
范围
对象。