Python-获取特定键的所有值

时间:2020-06-28 12:56:27

标签: python json python-3.x

我目前正在使用twitter API。到目前为止,我设法获得了一条特定的tweet作为json和prettyprint。输出为:

{
    "contributors": null,
    "coordinates": null,
    "created_at": "Sun Jun 28 12:32:35 +0000 2020",
    "display_text_range": [
        19,
        23
    ],
    "entities": {
        "hashtags": [],
        "symbols": [],
        "urls": [],
        "user_mentions": [
            {
                "id": 11883745733410470,
                "id_str": "11883745733410470",
                "indices": [
                    0,
                    10
                ],
                "name": "Account1",
                "screen_name": "account1"
            },
            {
                "id": 27822535,
                "id_str": "27822535",
                "indices": [
                    11,
                    18
                ],
                "name": "Account2",
                "screen_name": "account2"
            }
        ]
    },
    "favorite_count": 0,
    "favorited": false,
    "filter_level": "low",
    "geo": null,

如何将关键实体的所有值-> user_mentions-> screen_name存储在变量,列表或其他内容中?我只想存储它们,以后再做些事情。

到目前为止,我得到了:

def on_data(self, data):
    # Twitter returns data in JSON format - we need to decode it first
    decoded = json.loads(data)
    #print(json.dumps(decoded, indent=4, sort_keys=True))
    tweet_id = decoded['id_str']
    username = decoded['user']['screen_name']
    text = decoded['text']
    is_reply = decoded['in_reply_to_status_id']
    mentions = decoded['entities']['user_mentions']['screen_name']

这给了我一个错误,因为它当然返回了多个screen_name。

    mentions = decoded['entities']['user_mentions']['screen_name']
TypeError: list indices must be integers or slices, not str

3 个答案:

答案 0 :(得分:4)

该错误为您提供了很好的提示。 decoded['entities']['user_mentions'] 是一个列表,因此您可以使用以下方法获取所有屏幕名称:

for name in decoded['entities']['user_mentions']:
    # name['screen_name'] now is the name you want
    print(name['screen_name'])

如果您想要一个包含所有屏幕名称的长字符串,或执行其他各种操作,还可以使用列表函数(如@Sushanth注意到的join)。

答案 1 :(得分:1)

screen_names = [
        screen_name["screen_name"] for screen_name in decoded["entities"]["user_mentions"]
    ]

decoded['entities']['user_mentions']是一个列表,因此您只能使用索引进行访问。

def on_data(self, data):
    # Twitter returns data in JSON format - we need to decode it first
    decoded = json.loads(data)
    #print(json.dumps(decoded, indent=4, sort_keys=True))
    tweet_id = decoded['id_str']
    username = decoded['user']['screen_name']
    text = decoded['text']
    is_reply = decoded['in_reply_to_status_id']
    screen_names = [screen_name["screen_name"] for screen_name in decoded['entities']['user_mentions']]

答案 2 :(得分:0)

ffmpeg -re -i /home/dr_click/live.wav -af "anequalizer=c0 f=200 w=100 g=-5 t=0|c1 f=200 w=100 g=-5 t=0, anequalizer=c0 f=1000 w=100 g=3 t=0|c1 f=1000 w=100 g=3 t=0" -acodec pcm_s16be -ar 44100 -ac 2 -f rtp rtp://127.0.0.1:1234 是一个列表。

您可以使用decoded['entities']['user_mentions']来查看

type()

要获取单个名称,您必须使用索引print( type( decoded['entities']['user_mentions'] ) ) [0]和更高版本的[1]

["screen_name"]

要获取所有这些内容,您需要进行print( decoded['entities']['user_mentions'][0]["screen_name"] ) print( decoded['entities']['user_mentions'][1]["screen_name"] ) 循环

for

或列表理解

names = []

for item in decoded['entities']['user_mentions']:
    #print( item["screen_name"] )
    names.append(item["screen_name"])
    
print(names)  

最小的工作示例

names = [item["screen_name"] for item in decoded['entities']['user_mentions']]

print(names)
相关问题