如果元素(字符串)以 letter/number 开头,如何 select 列表组中列表的元素?
How to select elements of lists in a list group, if the elements(string) startswith a letter/number?
这里我想select每个列表中满足以'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']]"
试试这个:
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']]
。
您不需要将列表转换为 str(list),因为它已经是字符串类型。
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']]
当您执行 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
等,这几乎肯定会导致问题。
我不确定是否有任何特定原因需要使用 dataframe/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']]
这里我想select每个列表中满足以'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']]"
试试这个:
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']]
。
您不需要将列表转换为 str(list),因为它已经是字符串类型。
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']]
当您执行 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
等,这几乎肯定会导致问题。
我不确定是否有任何特定原因需要使用 dataframe/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']]