簡體   English   中英

使用生成器表達式有什么問題?

[英]What's wrong with my use of generator expression?

我有以下代碼,其中我嘗試將范圍的字符串表示形式轉換為數字列表。 例如,如果輸入為'0-0,3-5,7-10'則預期輸出為[0,3,4,5,7,8,9,10] 但是,我在以下地方遇到錯誤:

for l,h in r.split('-') 

它表示沒有足夠的值可解壓。 我的推理是, r的形式應為'x-y' ,因此,如果將其除以'-' ,則應該返回兩個值。 怎么了

def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    g = (
        (l,h)
        for r in ranges.split(',')
        for l,h in r.split('-')
        )
    return (x
            for range_tuple in g
            for l,h in range_tuple
            for x in range(int(l), int(h)+1)
            )

parse_ranges('0-5,8-10,11-13')

您的循環太多了。 由於您試圖將兩個數字保持在一起,因此不需要第二個嵌套循環。 第二個是將結果展平:

>>> [x for r in s.split(',') for x in r.split('-')]
['0', '0', '3', '5', '7', '10']

使用一個使數字保持配對:

>>> [r.split('-') for r in s.split(',')]
[['0', '0'], ['3', '5'], ['7', '10']]

然后,通過第二個理解,可以通過將lh解包到適當的位置來組合前兩個for循環。

return (x
        for l,h in g
        for x in range(int(l), int(h)+1)
        )

intspan模塊可以做到這一點。

import intspan
s =  '0-0,3-5,7-10'

>>> list(intspan.intspan(s))
[0, 3, 4, 5, 7, 8, 9, 10]

如果您的目標是將具有該格式的字符串解析為int列表,則可能值得使用正則表達式對其進行解析

def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    return re.split(',|-', ranges)

parse_ranges('0-5,8-10,11-13')

輸出:

['0', '5', '8', '10', '11', '13']

要將它們獲取為整數而不是字符串,可以執行以下操作:

def parse_ranges(ranges):
    """Return a list of numbers corresponding to number ranges in a string"""
    return (int(x) for x in re.split(',|-', ranges))

list(parse_ranges('0-5,8-10,11-13'))

輸出:

[0, 5, 8, 10, 11, 13]

我一直無法弄清楚如何避免將每個范圍字符串分割兩次,但是由於效率低下,可以將其變成單個表達式:

def parse_ranges(ranges):
    return tuple(x for r in
                    (range(int(pair.split('-')[0]), int(pair.split('-')[1])+1)
                        for pair in
                            ranges.split(',')) for x in r)

print(parse_ranges('0-0,3-5,7-10'))  # -> (0, 3, 4, 5, 7, 8, 9, 10)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM