我想做的是:
Str = "yes"
lst = ["e1", "e2", "e3", "y1", "y2", "y3", "s1", "s2", "s3"]
我希望能够打印列表中具有Str字符的每个项目。所以例如我希望它返回这个:
["y1", "y2", "y3", "e1", "e2", "e3", "s1", "s2", "s3"]
因为那是Str的顺序。到目前为止我有这个:
newlst = []
while lst != []:
if Str[0] in text[0]:
newlst += text[0]
lst = lst[1:]
Str = Str[1:]
else:
lst = lst[1:]
我的问题是它只给了我:
["y1", "y2", "y3"]
这是因为列表现在是[]。有没有办法在不缩短清单的情况下做到这一点?所以保持它相同但只是提取包含Str [n]的列表中的值?
答案 0 :(得分:1)
使用列表理解,我与第一项
进行了比较[x for item in Str for x in list if x[0] in item]
输出:
['y1', 'y2', 'y3', 'e1', 'e2', 'e3', 's1', 's2', 's3']
答案 1 :(得分:0)
您可以根据字母在sort
中的位置my_str
来my_str = "yes"
my_list = ['e1', 'e2', 'e3', 'y1', 'y2', 'y3', 's1', 's2', 's3']
res = sorted(my_list, key= lambda x: my_str.find(x[0]))
print(res) # -> ['y1', 'y2', 'y3', 'e1', 'e2', 'e3', 's1', 's2', 's3']
初始列表:
'y2'
备注强>
'y1'
仅在my_list
之后显示,因为这是原始列表中的顺序(str
)。如果您希望数字充当 tie-brakers ,则必须稍微修改一下代码。list
和print('yes'.find('y')) # -> 0 |
print('yes'.find('e')) # -> 1 | -> values used by the sorting (smallest to largest)!
print('yes'.find('s')) # -> 2 |
这样的Python内置名称。您将覆盖以后可能需要的功能。IllegalArgumentException - if there are any duplicate elements
答案 2 :(得分:0)
您还可以使用defaultdict
from collections import defaultdict
my_string = "yes"
my_list = ["e1", "e2", "e3", "y1", "y2", "y3", "s1", "s2", "s3"]
d = defaultdict(list)
for string in my_list:
key = string[0]
d[key].append(string)
>>> print(dict(d))
{'e': ['e1', 'e2', 'e3'], 's': ['s1', 's2', 's3'], 'y': ['y1', 'y2', 'y3']}
然后只需运行my_string
的排序,并将结果列表与itertools.chain.from_iterable()
连接起来:
>>> import itertools
>>> lsts = [d[key] for key in my_string]
>>> print(lsts)
[['y1', 'y2', 'y3'], ['e1', 'e2', 'e3'], ['s1', 's2', 's3']]
>>> print(list(itertools.chain.from_iterable(lsts)))
['y1', 'y2', 'y3', 'e1', 'e2', 'e3', 's1', 's2', 's3']
或者:
>>> print([item for sublist in lsts for item in sublist])
['y1', 'y2', 'y3', 'e1', 'e2', 'e3', 's1', 's2', 's3']