迭代搜索certein元素python的列表

时间:2017-10-10 09:08:02

标签: python list loops for-loop

我有一个如下所示的列表:

Lprices=["a","b","c","500 $",d,e,....]

我想创建一个仅包含Lprices列表中的价格的列表。 Lprices背后的逻辑是它包含3个单词元素,然后是价格,还有3个单词元素和价格。 问题是,有时在3个单词元素之后没有价格,所以在下一个价格之前连续有6或9个单词元素: 例如:

Lprices=["a","b","c","d","e","f",500$]

所以我写了一个代码,它不是非常pythonic,从我的C ++大学课程更直接前进

prices = []
i=0
count=0
for price in Lprices:
    count=count+1
    if '₪' in price:
        if (count+i)%4==0:
            prices.append(price)
        else:
            i=i+1
            prices.append("No Price")
            prices.append(price)

编辑: 输出应该是这样的:

prices=["price1","price2","No Price","price4"]

意味着我需要知道是否没有价格。

这段代码的问题在于它每次只处理1个缺失价格的选项而不是更多,而且,它根本不是pythonic。

第二次编辑: 这是原始数据:

  

并[a,A,A,$ 4,B,B,B,$ 5,C,C,C,d,d,d,2 $,R,R,R,F,F,F,G ,G,G,3 $ ...]   像这样继续大约200个元素

有没有办法改善它?

3 个答案:

答案 0 :(得分:1)

这将简单检查第4个列表项是否存在且是否为价格。如果是,我们在开头有3个字+价格;否则只有3个字,没有价格。然后对列表的其余部分重复测试。

NOPRICE = "no price"
def prices(lst):
    while lst:
        try:
            p = lst[3]
        except IndexError:
            yield NOPRICE
            break
        if '$' in p:  # improve the price test if necessary
            yield p
            lst = lst[4:]
        else:
            yield NOPRICE
            lst = lst[3:]


Lprices=["a","b","c","d","e","f","500$"]
print(list(prices(Lprices)))

答案 1 :(得分:0)

可能有更好的方法可以做到这一点,但我想通过列表推理进行广泛的操作,以给它一个 Pythonic 的感觉。 此外,您可以减少列表推导的数量,但随后它将变得不可读。

import itertools
Lprices = ["a","b","c","500 $","d","e","f", "g","h", "i", "600 $"]

price_list = [list(x[1]) for x in itertools.groupby(Lprices, lambda x: "$" in x)]
print(price_list)
# [['a', 'b', 'c'], ['500 $'], ['d', 'e', 'f', 'g', 'h', 'i'], ['600 $']]
# Above step clusters in sub-lists those with '$' symbol and no '$' symbol.

price_list = [price if len(price) == 1 else ['No price'] * ((len(price) - 3) // 3) for price in price_list]
print(price_list)
# [[], ['500 $'], ['No price'], ['600 $']] Notice empty array
# Above step replaces non $ symbols with No-price list. 
# If contains only 3 elements, no substitution will take place.

price_list = [item for sublist in price_list for item in sublist]
print(price_list)
# ['500 $', 'No price', '600 $']

您必须阅读groupby的文档才能更好地理解它。

希望答案可以帮到你。

答案 2 :(得分:0)

  • 弹出3个元素并检查4个元素。
  • 如果第4个值是价格,则弹出它并附加到val列表,否则继续。

<强>代码:

Lprices=['a','a','a','4$','b','b','b','5$','c','c','c','d','d','d','2$','r','r','r','f','f','f','g','g','g','3$']

a = True
val =  []
list_zero = False
i = 0
while True:
    for i in range(3):
        if len(Lprices) != 0:
            Lprices.pop(0)
        else:
            list_zero = True
            break

    if list_zero is False:

        if '$' in Lprices[0]:
            val.append(Lprices[0])
            Lprices.pop(0)
        else:
            val.append('No Price')
    else:
        break

print val

<强>输出

C:\Program Files (x86)\Python27> python demo.py
['4$', '5$', 'No Price', '2$', 'No Price', 'No Price', '3$']