我有以下数据。我的目标是检查每一行是否属于美国。
data = [', Accomack, Virginia, USA',
'Elkin, Surry, North Carolina, USA',
'Philippines',
'(null)',
'Texas, United States',
'Kingston, Washington, Rhode Island, United States']
我首先使用以下内容将它们拆分为列表中的列表并删除空格:
place = []
for d in data:
row = d.split(',')
rowlist = []
for r in row:
r_stripped = r.strip()
rowlist.append(r_stripped)
place.append(rowlist)
place
我得到了以下输出,这是我的预期:
[['', 'Accomack', 'Virginia', 'USA'],
['Elkin', 'Surry', 'North Carolina', 'USA'],
['Philippines'],
['(null)'],
['Texas', 'United States'],
['Kingston', 'Washington', 'Rhode Island', 'United States']]
然后我使用以下内容尝试查看每件商品是否在美国:
country = []
US = ['USA', 'United States']
for p in place:
for item in US:
if item in p:
c = 'US'
else:
c = 'Non-US'
country.append(c)
country
由于某些原因,代码无法捕获前两行作为美国的一部分。
['Non-US', 'Non-US', 'Non-US', 'Non-US', 'US', 'US']
如果我删除其他内容会更加好奇:c ='非美国'条件,一切都变成美国'。
任何人都可以告诉我我做得对吗?谢谢!
答案 0 :(得分:2)
您应该通过更新内部循环来检查p
中的任何项是否在名为US
的列表中:
>>> for p in place:
... for item in p:
... if item in US:
... c = "US"
... break
... else:
... c = "Non-US"
... country.append(c)
仅当循环不中断时,才会执行内部for循环的 else 子句。当您在item
列表中看到US
时,您会跳出该行中下一个p
的循环。
-
但是,您可以通过利用any()
和一些列表推导来提高用户可读性:
>>> ["US" if any(item in US for item in p) else "Non-US" for p in place]
['US', 'US', 'Non-US', 'Non-US', 'US', 'US']
-
any()
也可以帮助你完全消除内循环:
>>> for p in place:
... if any(item in US for item in p):
... c = "US"
... else:
... c = "Non-US"
... country.append(c)
答案 1 :(得分:1)
new_data = filter(lambda x: 'USA' in x or 'United States' in x, data)
return new_data