如何在不缩短python列表的情况下打印列表中的每个值?

时间:2017-12-04 08:55:39

标签: python list

我想做的是:

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]的列表中的值?

3 个答案:

答案 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_strmy_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'

备注

  1. 'y1'仅在my_list之后显示,因为这是原始列​​表中的顺序(str)。如果您希望数字充当 tie-brakers ,则必须稍微修改一下代码。
  2. 不要使用像listprint('yes'.find('y')) # -> 0 | print('yes'.find('e')) # -> 1 | -> values used by the sorting (smallest to largest)! print('yes'.find('s')) # -> 2 | 这样的Python内置名称。您将覆盖以后可能需要的功能。
  3. 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']