我有一个如下所示的列表:
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个元素
有没有办法改善它?
答案 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)
<强>代码:强>
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$']