#python #string #list #startswith
#python #строка #Список #начинается с
Вопрос:
Здесь я хочу выбрать элементы в каждом списке, которые удовлетворяют условию, что они начинаются с ‘6’. Однако я не нашел способа добиться этого.
Списки преобразуются из фрейма данных:
d = {'c1': ['64774', '60240', '60500', '19303', '38724', '11402'],
'c2': ['', '95868', '95867', '60271', '60502', '19125'],
'c3':['','','','','95867','60500']}
df= pd.DataFrame(data=d)
df
c1 c2 c3
64774
60240 95868
60500 95867
19303 60271
38724 60502 95867
11402 19125 60500
list = df.values.tolist()
list = str(list)
list
[['64774', '', ''],
['60240', '95868', ''],
['60500', '95867', ''],
['19303', '60271', ''],
['38724', '60502', '95867'],
['11402', '19125', '60500']]
Я попробовал код, подобный:
[x for x in list if x.startswith('6')]
Однако он вернул ‘6’ только для элементов, удовлетворяющих условию
['6', '6', '6', '6', '6', '6', '6', '6', '6']
То, что я ищу, — это группа списков типа:
"[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]"
Ответ №1:
Когда вы это делаете list = str(list)
, вы преобразуете свой список в строковое представление, т.е. list
становится
"[['64774', '', ''], ['60240', '95868', ''], ['60500', '95867', ''], ['19303', '60271', ''], ['38724', '60502', '95867'], ['11402', '19125', '60500']]"
Затем вы перебираете строку с пониманием списка
[x for x in list if x.startswith('6')]
Который выдает каждый отдельный символ в строке, что означает, что вы просто находите все вхождения 6
в строке, следовательно, ваш результат
['6', '6', '6', '6', '6', '6', '6', '6', '6']
Примечание: Не используйте имена переменных, которые затеняют встроенные функции, такие как list
, dict
и так далее, это почти наверняка вызовет проблемы в дальнейшем.
Я не уверен, есть ли какая-либо конкретная причина использовать фрейм данных / pandas для вашего вопроса. Если нет, вы могли бы просто использовать представление списка
d = {
'c1': ['64774', '60240', '60500', '19303', '38724', '11402'],
'c2': ['', '95868', '95867', '60271', '60502', '19125'],
'c3':['','','','','95867','60500']
}
d2 = [[x] for v in d.values() for x in v if x.startswith('6')]
# d2: [['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]
Комментарии:
1. Спасибо за все замечания!!
2. Всегда пожалуйста. Если один из приведенных здесь ответов решил вашу проблему, пожалуйста, отметьте его как ответ, щелкнув серую галочку рядом с ним.
Ответ №2:
Вам не нужно преобразовывать ваш список в str (список), поскольку он уже имеет строковый тип.
lst = df.values.tolist()
lst = [[i] for l in lst for i in l if i.startswith('6') ]
print(lst)
Результат:
[['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]
Комментарии:
1. Нет необходимости преобразовывать массив в список, вы могли бы просто сделать
[[a] for arr in df.to_numpy() for a in arr if a.startswith('6')]
(используя preferredto_numpy()
вместоvalues
).
Ответ №3:
Попробуйте это:
flatten = lambda l: [[item] for sublist in l for item in sublist]
print( flatten([ df[col][df[col].str.startswith("6") ].tolist() for col in df]))
Здесь я использовал генератор списков, который собирает все совпадающие ячейки в списке при переборе столбцов; это дает [['64774', '60240', '60500'], ['60271', '60502'], ['60500']]
. Чтобы получить желаемый результат, я определил функцию, flatten
которая (несколько) выравнивает этот список до [['64774'], ['60240'], ['60500'], ['60271'], ['60502'], ['60500']]
.