将部分说明留空,以便 python 完成



我是Python的新手,所以我不知道这是否可能,但我的猜测是肯定的。我想遍历一个列表,并根据项目的价值将项目放入新列表中。例如,如果item_x == 4,我想把它放在一个名为list_for_4的列表中。我的列表中所有其他项目和数字 0 到 10 也是如此。那么,是否可以概括一个语句,如果item_x == *a certain value*,它将被附加到list_for_*a certain value*? 谢谢!

也许在里面使用带有 if 语句的列表理解?

喜欢:

list_for_4 = [x for x in my_list if x==4]

并将其与字典相结合。

通过简单的迭代列表:

lst_for_1 = []
lst_for_2 = []
lst_for_3 = []
d = {1: lst_for_1, 2: lst_for_2, 3: lst_for_3}
for x in lst:
d[x].append(x)

或者,如果你想要一个比 x 值更复杂的条件,请定义一个函数:

def f(x):
if some condition...:
return lst_for_1
elif some other condition:
return lst_for_2
else:
return lst_for_3

然后将d[x].append(x)替换为f(x).append(x)

如果你不想自己做迭代,你也可以使用 map:

list(map(lambda x: d[x].append(x),lst))

list(map(lambda x: f(x).append(x),lst))

带有map的版本将返回您不关心的Nones列表。map(...)返回一个迭代器,只要不循环访问它(例如,将其结果转换为列表(,它就不会执行映射。这就是为什么你需要list(map(...)),它将创建一个虚拟列表,但在途中将lst的项目附加到正确的列表中,这就是您想要的。

不知道为什么要这样做。但你可以做到。

data = [1, 2, 3, 4, 1, 2, 3, 5]
for item in data:
name = f'list_for_{item}'
if name in globals():
globals()[name].append(item)
else:
globals()[name] = [item]

而不是尝试生成动态变量。使用字典结构的地图可能会对您有所帮助。

例如:

from collections import defaultdict
item_list = [1, 2, 3, 9, 2, 2, 3, 4, 4]
# Use a dictionary which elements are a list by default:
items_map = defaultdict(list)
for i in item_list:
items_map['list_for_{}'.format(i)].append(i)
print(items_map)
#  Test the map for elements in the list:
if 'list_for_4' in items_map:
print(items_map['list_for_4'])
else:
print('`list_for_4` not found.')

或者,如果您只需要某个项目在列表中出现的次数,则可以使用 Counter:

from collections import Counter
item_list = [1, 2, 3, 9, 2, 2, 3, 4, 4]
result = Counter(item_list)
print(result)

最新更新