按特定顺序查找列表组合 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()
)。将其用作 sort
的 key
,但也使用组的长度优先考虑较长的组合:
>>> 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
我打印了 i
和 j
以便更好地理解。
猜测有更好的方法...但我相信这应该有效:
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']]
我有一个列表,例如
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()
)。将其用作 sort
的 key
,但也使用组的长度优先考虑较长的组合:
>>> 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
我打印了 i
和 j
以便更好地理解。
猜测有更好的方法...但我相信这应该有效:
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']]