【问题标题】:How to reference a value in a dictionary if the value is a list of strings?如果值是字符串列表,如何引用字典中的值?
【发布时间】:2018-04-08 11:04:45
【问题描述】:

我正在从 Twitter 收集数据,每条推文都是字典的形式。

我的完整数据集是数千条推文的列表(字典列表)。

我想在每条推文中引用主题标签,但我需要帮助弄清楚如何做到这一点。

以下是包含相关数据的两条部分推文的列表示例:

twitter_tweets =  
[{'created_at': 'Wed Oct 18 22:20:30 +0000 2017', 'id': 920776631102214144, 'entities': {'hashtags': ['#dataanalyst#', '#politics']} 'user': {'id': 119116331, 'statuses_count': 32796, 'verified': False, 'lang': 'en-'}, 'retweet_count': 0, 'favorite_count': 0}
{'created_at': 'Wed Oct 17 12:20:36 +0000 2017', 'id': 920776631106514144, 'entities': {'hashtags': ['#california', '#nationalparks']}  'user': {'id': 119159331, 'statuses_count': 32796, 'verified': False, 'lang': 'en-gb'}, 'retweet_count': 1, 'favorite_count': 2}]

请注意,“entities”键的值是第二个字典。在第二个字典中,“hashtags”是键,值是标签列表。

这是我试图收集所有这些标签的列表以创建频率系列的代码:

def make_tweets_series(input_list, first_key, second_key):
    final_keys_list = []
    for line in input_list:
        tweets_by_key = line[first_key][second_key]
        final_keys_list.append(tweets_by_key)
        series_key_values = pd.Series(final_keys_list).value_counts()

    return series_key_values


hashtag_distribution_series = make_tweets_series(twitter_tweets, 'entities', 'hashtags')

我认为,如果“hashtags”值是一个字符串,这段代码可以工作,但它不起作用,因为“hashtags”是一个字符串列表。

如何引用这些列表中的每个主题标签并将它们放入一个系列中?

我的完整错误消息以及回溯如下:

Traceback (most recent call last):

  File "<ipython-input-60-7623feb35c84>", line 13, in <module>
    hashtag_distribution_series = make_tweets_series(twitter_tweets, 'entities', 'hashtags')

  File "<ipython-input-60-7623feb35c84>", line 6, in make_tweets_series
    series_key_values = pd.Series(final_keys_list).value_counts()

  File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/base.py", line 938, in value_counts
    normalize=normalize, bins=bins, dropna=dropna)

  File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/algorithms.py", line 640, in value_counts
    keys, counts = _value_counts_arraylike(values, dropna)

  File "/home/tommy/anaconda3/lib/python3.6/site-packages/pandas/core/algorithms.py", line 685, in _value_counts_arraylike
    keys, counts = f(values, dropna)

  File "pandas/_libs/hashtable_func_helper.pxi", line 356, in pandas._libs.hashtable.value_count_object (pandas/_libs/hashtable.c:29440)

  File "pandas/_libs/hashtable_func_helper.pxi", line 367, in pandas._libs.hashtable.value_count_object (pandas/_libs/hashtable.c:29189)

TypeError: unhashable type: 'list'

【问题讨论】:

  • 每当您发布错误时,请将整个跟踪发布回来
  • 您是否意识到主题标签在用作键时需要是字符串?在您的输入中并非如此。不确定是错字还是错误。
  • @utengr 是的,这是一个错字。我会解决的。

标签: python pandas dictionary for-loop twitter


【解决方案1】:

list 是不可散列的

字面意思;您不能散列 list 对象。 dicts 使用对象的哈希值查找 key -> value;这样更快。

改用tuple,所以在返回字符串列表的地方,只需调用tuple(...)。元组是不可变的有序集合,除了不可变和可散列外,其行为类似于列表。

【讨论】:

  • 谢谢。我不知道如何使用 tuple()。我的代码会去哪里?
  • @ThomasErnste series_key_values = pd.Series(tuple(final_keys_list)).value_counts()
  • 我不确定我是否按照您的意图更改了代码。我尝试在我的代码中替换您的行“series_key_values = pd.Series(tuple(final_keys_list)).value_counts()”而不是我的行“series_key_values = pd.Series(final_keys_list).value_counts()”我收到相同的错误消息 - - " TypeError: unhashable type: 'list'"
  • @ThomasErnste 嗯。试试final_keys_list.append(tuple(tweets_by_key)) 另外,series_key_values = ... 应该在循环结束后继续。
猜你喜欢
  • 2020-06-28
  • 2018-03-08
  • 1970-01-01
  • 1970-01-01
  • 2019-08-06
  • 2020-06-10
  • 2017-05-26
  • 1970-01-01
  • 2019-06-03
相关资源
最近更新 更多