【问题标题】:python, x in list and x == list[28] deliver different resultspython, x in list 和 x == list[28] 提供不同的结果
【发布时间】:2021-07-22 16:00:07
【问题描述】:

我正在尝试查找某个字符串是否在列表中。使用时:'if string in list' 我得到一个false。但是当我尝试'if string == list[28]' 时,我得到了true

怎么来的?该字符串肯定在列表中。

import pandas as pd
import numpy as np
import scipy.stats as stats
import re

nba_df=pd.read_csv("assets/nba.csv")
cities=pd.read_html("assets/wikipedia_data.html")[1]
cities=cities.iloc[:-1,[0,3,5,6,7,8]]
nba_df = nba_df[(nba_df['year'] == 2018)]
nba_df['team'] = nba_df['team'].apply(lambda x: x.split('*')[0])
nba_df['team'] = nba_df['team'].apply(lambda x: x.split('(')[0])
nba_df['team'] = nba_df['team'].str.strip()

cityList = cities['Metropolitan area'].str.strip()

actualCities = []
for idx, city in enumerate(nba_df['team']):
    if city == 'New Orleans Pelicans':
        print('string: ', city.split()[0] + ' ' + city.split()[1])
        print('cityList[28]: ', cityList[28])
        print('is string in list: ', (city.split()[0] + ' ' + city.split()[1]) in cityList)
        print('is string == list[28]: ', (city.split()[0] + ' ' + city.split()[1]) == cityList[28])

输出:

string:  New Orleans
cityList[28]:  New Orleans
is string in list:  False
is string == list[28]:  True

【问题讨论】:

  • 我猜你现在正在有效地这样做:(city.split()[0] + ' ') + (city.split()[1] in cityList)。所以我猜你想要这个:(city.split()[0] + ' ' + city.split()[1]) in cityList
  • cityList[28] 的确切值是多少?我尝试复制但不能
  • 请问list[28] / cityList[28]的值是多少。您的问题不完整。
  • 对不起,如果确实提出了一个非常明确的问题。多年来没有在这里张贴任何东西。我尝试按照 Wolph 的建议添加括号。不幸的是它没有帮助。 cityList[28] 的值是新奥尔良。我添加了一行打印它。希望有帮助

标签: python list


【解决方案1】:

您的问题似乎与使用 in 运算符的成员资格测试有关,尤其是与 pandas “容器”(例如 DataFrames 和 Series)有关。当你说:

怎么来的?该字符串肯定在列表中。

这不太准确。您的 cityListSeries 对象,而不是 list。这产生了一些我们必须解决的怪癖,因为我们不能将Series 视为与列表相同。通常Series 的行为更像dictionary 而不是列表。

我已经为您的代码创建了一个截断的测试示例,使用此处的设置:

import pandas as pd

data = {
    "Teams": [ "Boston Celtics", "Brooklyn Nets", "New York Knicks", "Philadelphia 76ers", "Toronto Raptors", "Chicago Bulls", "Cleveland Cavaliers", "Detroit Pistons", "Indiana Pacers", "Milwaukee Bucks", "Atlanta Hawks", "Charlotte Hornets", "Miami Heat", "Orlando Magic", "Washington Wizards", "Denver Nuggets", "Minnesota Timberwolves", "Oklahoma City Thunder", "Portland Trail Blazers", "Utah Jazz", "Golden State Warriors", "Los Angeles Clippers", "Los Angeles Lakers", "Phoenix Suns", "Sacramento Kings", "Houston Rockets", "Memphis Grizzlies", "San Antonio Spurs", "New Orleans Pelicans" ],
    "Cities": [ "Boston", "Brooklyn", "New York", "Philadelphia", "Toronto", "Chicago", "Cleveland", "Detroit", "Indiana", "Milwaukee", "Atlanta", "Charlotte", "Miami", "Orlando", "Washington", "Denver", "Minnesota", "Oklahoma City", "Portland", "Utah", "Golden", "Los Angeles", "Los Angeles", "Phoenix", "Sacramento", "Houston", "Memphis", "San Antonio", "New Orleans" ]
}

nba_df = pd.DataFrame(data, columns = ['Teams', 'Cities'])
# doing this to mimic your code of storing the Series to cityList
cityList = nba_df['Cities'].str.strip()

print(cityList)
print(type(cityList))

输出:

0            Boston
1          Brooklyn
2          New York
...
28      New Orleans
<class 'pandas.core.series.Series'>

关键是使用cityList.values,而不仅仅是cityList。但是,我鼓励您阅读 Series.values documentation,因为 Pandas 不再建议使用此属性(看起来 Series.array 是在 0.24 中添加的,他们建议改用它)。 PandasArraynumpy.ndarray 似乎都更像list,至少在这个例子中,当涉及到成员资格测试时。同样,强烈建议阅读Series.array documentation

终端示例:

>>> cityList[28]
'New Orleans'
>>> 'New Orleans' in cityList
False
>>> 'New Orleans' in cityList.values
True
>>> 'New Orleans' in cityList.array
True

您也可以从您的cityList(同样是Series)创建一个列表

>>> list(cityList)
['Boston', 'Brooklyn', ..., 'New Orleans']
>>> 'New Orleans' in list(cityList)
True

旁注

我可能会将您的 cityList 重命名为 citySeries 或类似名称,以在您的代码中说明您处理的不是列表,而是来自 pandas 库的“特殊”容器。

或者,您可以像这样创建cityList注意:我现在使用的是您的代码,而不是我的示例):

cityList = list(cities['Metropolitan area'].str.strip())

我确实需要对这个答案进行一些研究,因为我绝不是 pandas 专家,所以以下三个问题帮助我解决了这个问题:

【讨论】:

  • 感谢 Aelarion 的详细解答!
  • 乐于助人! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-13
  • 2020-07-11
  • 1970-01-01
  • 1970-01-01
  • 2021-11-03
相关资源
最近更新 更多