如果元素(字符串)以字母/数字开头,如何选择列表组中列表的元素?

时间:2019-04-24 20:39:09

标签: python string list startswith

在这里,我想在每个列表中选择满足以“ 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']]"

3 个答案:

答案 0 :(得分:2)

执行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']

旁注:不要使用遮盖内置函数的变量名,例如listdict等,它几乎肯定会引起问题。

我不确定是否有任何特定原因要使用数据框/熊猫来回答您的问题。如果没有,您可以简单地使用列表理解

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 :(得分:1)

由于列表已经是字符串类型,因此无需将其转换为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']]

答案 2 :(得分:0)

尝试一下:

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']]