从满足条件的多个值中选择一个值

时间:2017-12-09 05:48:01

标签: python-3.x

假设我有一个这样的列表:

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']

2 个答案:

答案 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.groupbykey 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

尝试一下。