假设我有一个这样的列表:
a = ['eddy', 'dyed', 'dye', 'dey', 'ed', 'ye', 'de']
然后输出应为:
new_list = ['eddy','dye','ed']
将始终使用第一个元素(即' eddy')然后下一个元素的长度应该比前一个元素少一个字符(在这种情况下,'染色的长度&# 39;比'eddy'等等少一个字符。我只需要满足条件的第一个元素。 (不需要' dey'即使它满足条件。只需要一个满足条件的元素)
可以有多种方法来实现这一点,但我似乎无法找到正确实现它的方法。以下是我到目前为止所尝试的内容。
a = ['eddy', 'dyed', 'dye', 'dey', 'ed', 'ye', 'de']
temp=[a[0]] #first element will always be taken
i=0
while i<len(a):
if len(a[i]) == len(temp[0])-1:
temp.append(a[i])
i+=1
这给了我以下输出不正确的信息:
['eddy', 'dye', 'dey']
@Mad Physicist:我提供了以下列表:
a=['abaca', 'baa', 'cab', 'aba', 'ab', 'ba', 'aa']
它给了我以下输出:
['abaca']
答案 0 :(得分:1)
您的解决方案的基本问题是您要与原始元素的长度进行比较,而不是最后一个元素的长度。为此,您可以使用Python的方便的负索引功能。只需将if len(a[i]) == len(temp[0])-1:
更改为if len(a[i]) == len(temp[-1])-1:
。
实际上存在另一个问题,即您的辅助数据集展示。你只检查下一个单词是否恰好比前一个短,但你真的想检查它是否更短。所以if len(a[i]) == len(temp[0]) - 1:
应该是if len(a[i]) < len(temp[-1]):
。
这是IDEOne link。
话虽如此,您可以对代码进行其他一些改进。使用while
循环和索引计数器在Python中循环遍历数组并不是非常惯用,尤其是因为您根本不关心索引。更好的方法是做一些像
a = ['eddy', 'dyed', 'dye', 'dey', 'ed', 'ye', 'de']
temp=[a[0]] #first element will always be taken
for word in a:
if len(word) < len(temp[-1]):
temp.append(word)
这是IDEOne link。
最后,这就是Python,必须有一个像这样的一线解决方案,理所当然。在这种情况下,您可以将itertools.groupby
与key
len
一起使用:
from itertools import groupby
a = ['eddy', 'dyed', 'dye', 'dey', 'ed', 'ye', 'de']
temp = [next(group) for key, group in groupby(a, len)]
这是IDEOne link。
答案 1 :(得分:0)
这种情况正在发生,因为在你的if语句中,它总是检查第一个元素的长度,而不是它应该使用的新“长度”。因此,你继续抓住长度为3的元素。
newIndex = 0
while i < len(a):
if len(a[i]) == len(temp[newIndex])-1:
temp.append(a[i])
newIndex = i
i+=1
尝试一下。