按特定顺序查找列表组合 Python

Find combinations of list in specific order Python

我有一个列表,例如

descr_list = ["I","LOVE","DOGS"]

我想要一个可以按以下顺序创建子列表的循环

["I","LOVE","DOGS"]
["I","LOVE"]
["I"]
["LOVE","DOGS"]
["LOVE"]
["DOGS"]

这是我目前拥有的循环,我得到以下输出

for r in range(len(descr_list)):
    for j in range(r+1,len(descr_list)+1):
        result = descr_list[r:j]
        print(result)

['i']
['i', 'love']
['i', 'love', 'dogs']
['love']
['love', 'dogs']
['dogs']

如有任何帮助,我们将不胜感激。我知道我以前做过,但我不记得我是怎么做到的哈哈。我需要从列表中的第一个元素(我们可以调用 x)开始,它需要读取它之后的所有元素。然后向后走 1 个元素,直到它回到自身,然后跳转到下一个元素 (x+1) 并重复上面的相同过程,直到我们到达列表中的最后一个元素。

您可以使用 itertools 获取原始 list:

的所有组合
import itertools

descr_list = ["I","LOVE","DOGS"]

combos = []
for i in range(len(descr_list)):
    combos += list(itertools.combinations(descr_list, i+1))

所以combos是:

[('I',),
 ('LOVE',),
 ('DOGS',),
 ('I', 'LOVE'),
 ('I', 'DOGS'),
 ('LOVE', 'DOGS'),
 ('I', 'LOVE', 'DOGS')]

要获得所需的排序,请查看 combos 每个元素的第一个单词并找到它在 descr_list 中的位置(即 index())。将其用作 sortkey,但也使用组的长度优先考虑较长的组合:

>>> sorted(combos, key=lambda x: (descr_list.index(x[0]), 1/len(x)))

[('I', 'LOVE', 'DOGS'),
 ('I', 'LOVE'),
 ('I', 'DOGS'),
 ('I',),
 ('LOVE', 'DOGS'),
 ('LOVE',),
 ('DOGS',)]

您可以使用嵌套循环:

l = len(descr_list)
for i in range(l):
    for j in range(l, i, -1):
        print(f"{descr_list[i:j]} slice from {i} to {j}")

['I', 'LOVE', 'DOGS'] slice from 0 to 3
['I', 'LOVE'] slice from 0 to 2
['I'] slice from 0 to 1
['LOVE', 'DOGS'] slice from 1 to 3
['LOVE'] slice from 1 to 2
['DOGS'] slice from 2 to 3

我打印了 ij 以便更好地理解。

猜测有更好的方法...但我相信这应该有效:

    descr_list = ["I", "LOVE", "DOGS"]
    
    for word_index, word in enumerate(descr_list):
        for i in range(len(descr_list),0,-1):
            if descr_list[word_index:i]:
                result = descr_list[word_index:i]
                print(result)
 mylist = ["I","LOVE","DOGS"]

 sentences=[]
 for b in range(len(mylist)):
      for i in range(len(mylist),b,-1):
           sentence=[]
      for j in range(b,i):
            sentence.append(mylist[j])
      sentences.append(sentence)


  print(sentences)

  output:
  [['I', 'LOVE', 'DOGS'], ['I', 'LOVE'], ['I'], ['LOVE', 'DOGS'], ['LOVE'], ['DOGS']]