检查一个列表中的项是否存在于另一个列表中

时间:2016-05-19 01:45:16

标签: python list

我有以下数据。我的目标是检查每一行是否属于美国。

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 ='非美国'条件,一切都变成美国'。

任何人都可以告诉我我做得对吗?谢谢!

2 个答案:

答案 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