跳转至

3198. 查找每个州的城市 🔒

题目描述

表:cities

+-------------+---------+
| Column Name | Type    | 
+-------------+---------+
| state       | varchar |
| city        | varchar |
+-------------+---------+
(state, city) 是这张表的主键(有不同值的列的组合)。
这张表的每一行包含州名和其中的城市名。

编写一个解决方案来 查找每个州的所有城市,并将它们组合成 一个逗号分隔 的字符串。

返回结果表以 state 升序 排序。

结果格式如下所示。

 

示例:

输入:

cities 表:

+-------------+---------------+
| state       | city          |
+-------------+---------------+
| California  | Los Angeles   |
| California  | San Francisco |
| California  | San Diego     |
| Texas       | Houston       |
| Texas       | Austin        |
| Texas       | Dallas        |
| New York    | New York City |
| New York    | Buffalo       |
| New York    | Rochester     |
+-------------+---------------+

输出:

+-------------+---------------------------------------+
| state       | cities                                |
+-------------+---------------------------------------+
| California  | Los Angeles, San Diego, San Francisco |
| New York    | Buffalo, New York City, Rochester     |
| Texas       | Austin, Dallas, Houston               |
+-------------+---------------------------------------+

解释:

  • California:所有城市 ("Los Angeles", "San Diego", "San Francisco") 以逗号分隔的字符串列出。
  • New York:所有城市 ("Buffalo", "New York City", "Rochester") 以逗号分隔的字符串列出。
  • Texas:所有城市 ("Austin", "Dallas", "Houston") 以逗号分隔的字符串列出。

注意:输出表以州名升序排序。

解法

方法一:分组聚合

我们可以先按照 state 字段进行分组,然后对每个分组内的 city 字段进行排序,最后使用 GROUP_CONCAT 函数将排序后的城市名连接成一个逗号分隔的字符串。

1
2
3
4
5
6
7
# Write your MySQL query statement below
SELECT
    state,
    GROUP_CONCAT(city ORDER BY city SEPARATOR ', ') cities
FROM cities
GROUP BY 1
ORDER BY 1;
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
import pandas as pd


def find_cities(cities: pd.DataFrame) -> pd.DataFrame:
    result = (
        cities.groupby("state")["city"]
        .apply(lambda x: ", ".join(sorted(x)))
        .reset_index()
    )
    result.columns = ["state", "cities"]
    return result

评论